# 手工搭建LNMP环境（CentOS 7.2）
#### 简介
LNMP分别代表Linux、Nginx、MySQL和PHP，是目前主流的网站服务器架构之一，适合运行大型和高并发的网站应用，例如电子商务网站、社交网站、内容管理系统等。本文主要介绍了在华为云上如何使用CentOS 7.2 64位操作系统的Linux实例搭建LNMP环境。
Linux实例手工部署LNMP环境具体操作步骤如下：
1. [安装Nginx。]
2. [安装MySQL。]
3. [安装PHP。]
4. [浏览器访问测试。]
 
#### 前提条件
1. 弹性云服务器已绑定弹性公网IP。
2. 弹性云服务器所在安全组添加了如下表所示的安全组规则，具体步骤参见[为安全组添加安全组规则](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0030969470.html)。
   表1安全组规则 
   | 方向 | 优先级 | 策略 | 类型  | 协议端口    | 源地址        |
   |:---|:---|:---|:---|:---|:---|
   | 入方向 | 1       | 允许   | IPv4 | TCP: 80 | 0.0.0.0/0 |
      
   
3. 为了更好地获取和更新系统和软件，建议您更新镜像源为华为云镜像源，详细操作，请参见[如何使用华为云开源镜像配置yum源(x86_64和鲲鹏)？](https://support.huaweicloud.com/ecs_faq/zh-cn_topic_0118948562.html)。
 
#### 资源规划
本次实践所用的资源配置及软件版本如[表2]中所示。当您使用不同的硬件规格或软件版本时，本指导中的命令及参数可能会发生改变，需要您根据实际情况进行调整。
 表2资源和成本规划 
| 资源   | 资源说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 成本说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
|:---|:---|:---|
| 弹性云服务器  | - 计费模式：按需计费  - 可用区：可用区1  - 规格：s6.large.4  - 镜像：CentOS 7.2 64bit  - 系统盘：40G  - 弹性公网IP：现在购买  - 线路：全动态BGP  - 公网带宽：按流量计费  - 带宽大小：5 Mbit/s   | ECS涉及以下几项费用： - 云服务器  - 云硬盘  - 弹性公网IP   具体的计费方式及标准请参考[计费模式概述](https://support.huaweicloud.com/price-ecs/ecs_billing_2001.html)。 |
| Nginx | 是一个高性能的HTTP和反向代理web服务器。 获取方式： <https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | 免费                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| MySQL     | 是一款开源的关系数据库软件。 获取方式： <https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | 免费                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| PHP    | 是一款开源软件，用于Web开发。 获取方式： <https://mirrors.huaweicloud.com/remi/enterprise/remi-release-7.rpm>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 免费                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   
#### 操作步骤
1. 登录弹性云服务器。 
   具体操作请参见[Linux ECS登录方式概述](https://support.huaweicloud.com/usermanual-ecs/zh-cn_topic_0013771089.html)。
   
   
2. 安装Nginx。
   
   1. 执行以下命令，下载对应当前系统版本的Nginx包。
      ```
      wget https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
      ```
      
   
   2. 执行以下命令，建立Nginx的yum仓库。
      ```
      rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm
      ```
      
   
   3. 执行以下命令，安装Nginx。
      ```
      yum -y install nginx
      ```
      
   
   4. 执行以下命令，查看Nginx版本。
      ```
      nginx -v
      ```
      回显如下类似信息。
      ```
      nginx version: nginx/1.26.1
      ```
      
   
   5. 执行以下命令，启动Nginx并设置开机启动。
      ```
      systemctl start nginx
      systemctl enable nginx
      ```
      
   
   6. 查看启动状态。
      ```
      systemctl status nginx.service
      ```
      回显如下类似信息。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002295835177.png "点击放大")
      
   
   7. 使用浏览器访问 "http://*服务器IP地址* "，显示如下页面，说明Nginx安装成功。
      图1测试访问Nginx   
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000001987965090.png "点击放大") 
   
   
   
   
3. 安装MySQL。
   
   1. 依次执行以下命令，安装MySQL。
      ```
      rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
      yum -y install mysql-community-server
      ```
      
   
   2. 执行以下命令，查看MySQL版本。
      ```
      mysql -V
      ```
      回显如下类似信息。
      ```
      mysql  Ver 8.0.42 for Linux on x86_64 (MySQL Community Server - GPL)
      ```
      
   
   3. 依次执行以下命令，启动MySQL服务并设置开机自启动。
      ```
      systemctl start mysqld
      systemctl enable mysqld
      ```
      
   
   4. 查看MySQL运行状态。
      ```
      systemctl status mysqld.service
      ```
      回显如下类似信息。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002295771009.png "点击放大")
      
   
   5. 执行以下命令，获取安装MySQL时自动设置的root用户密码。
      ```
      grep 'temporary password' /var/log/mysqld.log
      ```
      回显如下类似信息。
      ```
      2018-08-29T07:27:37.541944Z 1 [Note] A temporary password is generated for root@localhost: 2YY?3uHUA?Ys
      ```
      
   
   6. 执行以下命令，并按照回显提示信息进行操作，加固MySQL。
      ```
      mysql_secure_installation
      ```
      ```
      Securing the MySQL server deployment.
      Enter password for user root:    #输入上一步骤中获取的安装MySQL时自动设置的root用户密码
      The existing password for the user account root has expired. Please set a new password.
      New password:  #设置新的root用户密码
      Re-enter new password:   #再次输入密码
      The 'validate_password' plugin is installed on the server.
      The subsequent steps will run with the existing configuration of the plugin.
      Using existing password for root.
      Estimated strength of the password: 100
      Change the password for root ? ((Press y|Y for Yes, any other key for No) : N   #是否更改root用户密码，输入N
       ... skipping.
      By default, a MySQL installation has an anonymous user,
      allowing anyone to log into MySQL without having to have
      a user account created for them. This is intended only for
      testing, and to make the installation go a bit smoother.
      You should remove them before moving into a production
      environment.
      Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y   #是否删除匿名用户，输入Y
      Success.
      Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network.
      Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y   #禁止root远程登录，输入Y
      Success.
      By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment.
      Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y   #是否删除test库和对它的访问权限，输入Y
       - Dropping test database...
      Success.
       - Removing privileges on test database...
      Success.
      Reloading the privilege tables will ensure that all changes
      made so far will take effect immediately.
      Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y   #是否重新加载授权表，输入Y
      Success.
      All done!
      ```
      
   
   
   
   
4. 安装PHP。
   
   1. 执行以下命令，安装EPEL源和Remi仓库。
      ```
      yum install -y epel-release
      rpm -Uvh https://mirrors.huaweicloud.com/remi/enterprise/remi-release-7.rpm
      ```
      
   
   2. 执行以下命令，安装Yum源管理工具。
      ```
      yum -y install yum-utils
      ```
      
   
   3. 执行以下命令，启用PHP 8.0仓库。
      ```
      yum-config-manager --enable remi-php80
      ```
      
   
   4. 执行以下命令，安装PHP。
      ```
      yum install -y php php-cli php-fpm php-mysqlnd php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath php-json
      ```
      
   
   5. 执行以下命令，验证PHP的安装版本。
      ```
      php -v
      ```
      回显如下类似信息：
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002024484829.png "点击放大")
      
   
   6. 执行以下命令，启动PHP服务并设置开机自启动。
      ```
      systemctl start php-fpm
      systemctl enable php-fpm
      ```
      
   
   7. 修改Nginx配置文件以支持PHP。
      1. 执行以下命令打开配置文件/etc/nginx/nginx.conf。
         ```
         vim /etc/nginx/nginx.conf
         ```
         图2nginx.conf   
         ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002024604377.png "点击放大")
         从nginx.conf可以看出，配置文件定向至/etc/nginx/conf.d/\*.conf。
         
      
      2. 输入**:quit**退出nginx.conf。
      
      3. 执行以下命令打开配置文件/etc/nginx/conf.d/default.conf。
         ```
         vim /etc/nginx/conf.d/default.conf
         ```
         
      
      4. 按**i**键进入编辑模式。
      
      5. 修改打开的"default.conf"文件。 找到server段落，修改或添加下列配置信息。
         - 在location的index配置行中添加index.php。
           ```
           location / {
                   root   /usr/share/nginx/html;
                   index  index.html index.htm index.php;  
               }
           ```
           
         
         - 添加以下配置信息。
           ```
           location ~ \.php$ {
                   root           /usr/share/nginx/html;
                   fastcgi_pass   127.0.0.1:9000;
                   fastcgi_index  index.php;
                   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                   include        fastcgi_params;
               }
           ```
           
         
         
         如[图3]所示：
         图3修改后截图   
         ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000001987965094.png "点击放大") 
      
      6. 按**Esc** 键退出编辑模式，并输入**:wq**保存后退出。
       
   
   8. 执行以下命令，重新载入Nginx的配置文件。
      ```
      service nginx reload
      ```
      
   
   
   
   
5. 浏览器访问测试。
   
   1. 在/usr/share/nginx/html/目录下创建"info.php"的测试页面。
      1. 执行以下命令创建并打开"info.php"的测试文件。
         ```
         vim /usr/share/nginx/html/info.php
         ```
         
      
      2. 按**i**键进入编辑模式。
      
      3. 修改打开的"info.php"文件，将如下内容写入文件。
         ```
         <?php
          phpinfo();
         ?>
         ```
         
      
      4. 按**Esc** 键退出编辑模式，并输入**:wq**保存后退出。
       
   
   2. 使用浏览器访问"http://*服务器IP地址/info.php* "，显示如下页面，说明环境搭建成功。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000001988124834.png "点击放大")
      
   
   
   
   
 
#### 后续操作
完成LNMP环境搭建后，您可以参考以下文档进行网站或应用搭建。
- [基于WordPress搭建个人网站（Linux）](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_topic_0135015337.html)
- [Nginx服务配置多站点](https://support.huaweicloud.com/bestpractice-ecs/ecs_bp_0402.html)
- [手工搭建Ghost博客（Ubuntu 22.04）](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_topic_0149023604.html)
- [搭建ThinkPHP框架](https://support.huaweicloud.com/bestpractice-ecs/ecs_bp_0268.html)
 
#### 常见问题
1. **浏览器访问超时或显示"无法访问此网站"**
   这通常是网络连接问题。请按以下顺序排查：
   1. 安全组：检查ECS实例的安全组入方向规则是否已放行80端口。
   
   2. 防火墙：检查操作系统内部的防火墙（如firewalld或ufw）是否关闭或已放行80端口。
   
   3. Nginx服务：执行**sudo systemctl status nginx** 检查Nginx服务是否正在运行。如果未运行，查看日志**sudo journalctl -xeu nginx**寻找错误原因。
   
   4. 端口占用：检查80端口是否被其他程序占用。详细排查方法，请参见[云服务器端口不通怎样排查？](https://support.huaweicloud.com/trouble-ecs/zh-cn_topic_0191526704.html)。
    
2. **浏览器显示"502 Bad Gateway"**
   此错误表示Nginx无法与PHP-FPM正常通信。
   1. PHP-FPM服务：执行**sudo systemctl status php-fpm** 检查服务是否运行。
      - 如果状态为Running，表示php-fpm已启动。
      
      - 如果状态为非Running，表示php-fpm没有启动，请执行**sudo systemctl start php-fpm**启动php-fpm。
       
   
   2. Socket路径：核对Nginx配置文件中fastcgi_pass指令的unix:后面的路径，是否与PHP-FPM配置文件中的listen路径完全一致。
   
   3. SELinux/AppArmor：在CentOS上，可能是SELinux策略阻止了Nginx与PHP-FPM的通信。尝试执行**sestatus**查看状态，并检查/var/log/audit/audit.log中的拒绝日志。
   
   4. Socket权限：检查Socket文件的权限，确保Nginx的运行用户有权读写该文件。
    
3. **如何允许MySQL远程访问？**
   默认配置下，MySQL禁止远程登录。如需开启，建议创建专用的远程用户，而不是直接开放root用户的远程访问权限。具体操作请参见[Linux系统中部署MySQL数据库](https://support.huaweicloud.com/bestpractice-ecs/ecs_bp_0502.html)。
   
 
