部署LNMP

作者: 唯爱熊 | 来源:发表于2019-11-04 12:20 被阅读0次

    一.LNMP简介

    1.LNMP的组成

    LNMP分别代表Linux、 Nginx、MySQL和PHP。

    2.LNMP工作流程

    Nginx作为web服务器,当它接收到请求后,Nginx是不支持对外部程序的直接调用或者解析,必须通过FastCGI进行调用。如果是PHP请求,则交给PHP解释器处理,并把结果返回给客户端。PHP-FPM是支持解析PHP的一个FastCGI进程管理器,提供了更好管理PHP进程的方式,可以有效控制内存和进程、可以平滑重载PHP配置。

    3.nginx与fast-cgi工作流程图解


    说明:php-fpm是控制php-fpm守护进程的(包括某个域名的访问日志、错误日志、session存放位置等)
    Nginx FastCGI的运行原理
    nginx fastcgi 访问PHP:
    1.用户发送http请求报文给nginx服务器
    2.nginx会根据文件url和后缀来判断请求
    3.如果请求的是静态内容,nginx会将结果直接返回给用户
    4.如果请求的是动态内容,nginx会将请求交给fastcgi客户端,通过fastcgi_pass将这个请求发送给php-fpm
    5.php-fpm收到请求后会通过本地监听的socket交给wrapper
    6.wrapper收到请求会生成新的线程调用php动态程序解析服务器
    7.如果用户请求的是博文、或者内容、PHP会请求MySQL查询结果
    8.如果用户请求的是图片、附件、PHP会请求nfs存储查询结果
    9.php会将查询到的结果交给Nginx
    10.nginx会生成一个响应报文返还给用户
    

    二.安装环境装备

    1. 关闭防火墙。

    1. 运行systemctl status firewalld命令查看当前防火墙的状态。

    [root@web01 ~]# systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
       Active: active (running) since Thu 2019-11-07 23:00:45 CST; 12s ago
         Docs: man:firewalld(1)
     Main PID: 7515 (firewalld)
       CGroup: /system.slice/firewalld.service
               └─7515 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
    
    Nov 07 23:00:44 web01 systemd[1]: Starting firewalld - dynamic firewall daemon...
    Nov 07 23:00:45 web01 systemd[1]: Started firewalld - dynamic firewall daemon.
    如果防火墙的状态参数是inactive,则防火墙为关闭状态。
    如果防火墙的状态参数是active,则防火墙为开启状态。本示例中防火墙为开启状态,因此需要关闭防火墙。
    
    

    2. 关闭防火墙。如果防火墙为关闭状态可以忽略此步骤。

    如果您想临时关闭防火墙,运行命令systemctl stop firewalld。
    说明 :这只是暂时关闭防火墙,下次重启Linux后,防火墙还会开启。
    如果您想永久关闭防火墙,运行命令systemctl disable firewalld。
    说明: 如果您想重新开启防火墙,请参见https://firewalld.org/
    

    3. 关闭SELinux。

    1. 运行getenforce命令查看SELinux的当前状态。

    [root@web01 ~]# getenforce 
    Disabled
    如果SELinux状态参数是Disabled, 则SELinux为关闭状态。
    如果SELinux状态参数是Enforcing,则SELinux为开启状态。本示例中SELinux为开启状态,因此需要关闭SELinux。
    

    2. 关闭SELinux。如果SELinux为关闭状态可以忽略此步骤。

    如果您想临时关闭SELinux,运行命令setenforce 0。
    说明 :这只是暂时关闭SELinux,下次重启Linux后,SELinux还会开启。
    如果您想永久关闭SELinux,运行命令vi /etc/selinux/config编辑SELinux配置文件。回车后,把光标移动到`SELINUX=enforcing`这一行,按`i`键进入编辑模式,修改为`SELINUX=disabled`, 按`Esc`键,然后输入`:wq`并按`Enter`键以保存并关闭SELinux配置文件。
    说明: 如果您想重新开启SELinux,请参见https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/deployment_guide/ch-selinux#s1-SELinux-resources)。
    

    3. 重启系统使设置生效。

    4.系统以及软件版本介绍

    使用了以下版本的软件:
    操作系统:公共镜像 CentOS 7.6 64位
    Nginx版本:Nginx 1.16.1-1
    MySQL版本:MySQL 5.7.28
    PHP版本:PHP 7.1

    三.安装LNMP

    1.创建统一用户

    [root@web01 ~]# groupadd www -g 666
    [root@web01 ~]# useradd www -s /sbin/nologin -M -u 666 -g 666
    [root@web01 ~]# id www
    uid=666(www) gid=666(www) 组=666(www)
    

    2.安装nginx

    1)使用nginx官方源

    nginx官方源请参考:http://nginx.org/en/linux_packages.html

    使用vim /etc/yum.repos.d/nginx.repo创建nginx.repo源文件,按i输入如下内容:
    
    [root@web01 ~]# vim /etc/yum.repos.d/nginx.repo
    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    按ESC输入:wq保存文件并退出。
    

    2)yum安装nginx

    [root@web01 ~]# yum -y install nginx
    

    3)启动nginx并加入开机自启动

    [root@web01 ~]# systemctl start nginx
    [root@web01 ~]#  systemctl enable nginx
    

    3.使用第三方扩展epel源安装PHP

    1)移除旧版本PHP

    [root@web01 ~]# yum remove php-mysql-5.4 php php-fpm php-common
    

    2)安装扩展源

    [root@web01 ~]# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    [root@web01 ~]# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
    

    3)安装PHP7.1版本

    [root@web ~]# yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
    

    4)配置php-fpm用户与nginx用户保持一致

    [root@web01 ~]# sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
    [root@web01 ~]# sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
    

    5)启动php-fpm并设置开机自启动

    [root@web01 ~]# systemctl start php-fpm
    [root@web01 ~]# systemctl enable php-fpm
    

    3.安装mysql数据库

    1)下载官方扩展源, 扩展源集成mysql5.6、5.7、8.0,仅5.7仓库是开启

    [root@web01 ~]# rpm -ivh http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql57-community-release-el7-10.noarch.rpm
    

    2)安装mysql数据库

    [root@web01 ~]# yum install mysql-community-server -y
    

    3)启动mysql并设置开机自启动

    [root@web01 ~]# systemctl start mysqld
    [root@web01 ~]# systemctl enable mysqld
    

    4)设置数据库的密码

    注意:mysql5.7版本之后,安装后的默认密码不再是空密码了,如果是刚安装的,可以在mysql的日志文件找到临时的登录密码!之后就可以自行设置密码了,另外,到了5.7版本,user表里就没有了password这个字段了,要想修改密码则需要用authentication_string这个字段。
    [root@web01 ~]# grep 'temporary password' /var/log/mysqld.log
    2019-11-08T23:39:39.839217Z 1 [Note] A temporary password is generated for root@localhost: Qjt2;DfHI0py
    [root@web01 ~]# mysql -uroot -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 10
    Server version: 5.7.28
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql> alter user 'root'@'localhost' identified by 'Weiaixiong-123456';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.01 sec)
    

    四.配置LNMP架构

    1.配置nginx实现动态请求php请求请参考nginx官方示例说明:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html

    使用vim  /etc/nginx/conf.d/wordpress.conf创建wordpress.conf配置文件,按i输入如下内容:
    [root@web01 ~]# vim /etc/nginx/conf.d/wordpress.conf
    server {
            server_name blog.wordpress.com;
            listen 80;
            root /code;
            index index.php index.html;
    
            location ~ \.php$ {
                    fastcgi_pass   127.0.0.1:9000;
                    fastcgi_index  index.php;
                    fastcgi_param  SCRIPT_FILENAME  /code$fastcgi_script_name;
                    include        fastcgi_params;
            }
    }
    按ESC输入:wq保存文件并退出。
    

    2.测试nginx与PHP的连通

    1)创建站点目录
    [root@web01 ~]# mkdir /code
    [root@web01 ~]# chown -R www.www /code/
    
    2)在站点下创建测试连通性文件
    使用vim /code/info.php,创建info.php文件,按i输入如下内容:
    [root@web01 ~]# vim /code/info.php
    <?php
        phpinfo();
    ?>
    按ECS输入:wq退出并保存文件。
    
    3)检查nginx的语法并重启
    [root@web01 ~]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@web01 ~]# systemctl restart nginx
    
    4)配置本地hosts文件之后测试
    5)测试PHP连接mysql数据库
    使用vim  /code/mysql.php创建mysql.php文件,按i 输入如下内容:
    [root@web01 ~]# vim /code/mysql.php
    <?php
        $servername = "localhost";
        $username = "root";
        $password = "Weiaixiong-123456";
    
        // 创建连接
        $conn = mysqli_connect($servername, $username, $password);
    
        // // 检测连接
        if (!$conn) {
            die("Connection failed: " . mysqli_connect_error());
        }
        echo "php 连接 MySQL 数据库成功";
    ?>
    按ECS输入:wq保存文件并退出
    

    测试访问结果如下:


    五.部署WordPress博客

    说明:之前的环境已经部署完成,这里只需创建一个数据库以及下载源码包安装即可。

    1.创建一个名为wordpress的数据库

    [root@web01 ~]# mysql -uroot -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 4
    Server version: 5.7.28 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> create database wordpress;
    Query OK, 1 row affected (0.00 sec)
    

    2.下载源码包并解压到站点目录下

    [root@web01 ~]# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
    [root@web01 ~]# ls
    anaconda-ks.cfg  hostname_ip.sh  wordpress-4.9.4-zh_CN.tar.gz
    [root@web01 ~]# tar xf wordpress-4.9.4-zh_CN.tar.gz -C /code/
    [root@web01 ~]# cd /code/
    [root@web01 /code]# ls
    info.php  mysql.php  wordpress
    

    3.修改站点目录并修改属主和属组

    [root@web01 ~]# cat /etc/nginx/conf.d/wordpress.conf
    server {
            server_name blog.wordpress.com;
            listen 80;
            root /code/wordpress;
            index index.php index.html;
    
            location ~ \.php$ {
                    fastcgi_pass   127.0.0.1:9000;
                    fastcgi_index  index.php;
                    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                    include        fastcgi_params;
            }
    }
    [root@web01 ~]# chown -R www.www /code/
    [root@web01 ~]# ll /code/
    total 12
    -rw-r--r-- 1 www www   24 Nov  9 09:32 info.php
    -rw-r--r-- 1 www www  339 Nov  9 09:39 mysql.php
    drwxr-xr-x 5 www www 4096 Feb  8  2018 wordpress
    [root@web01 ~]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@web01 ~]# systemctl restart  nginx
    

    4.浏览器访问并进一步部署wordpress

    15.png 16.png 17.png 18.png 19.png 20.png 21.png 22.png

    至此wordpress部署完成
    说明:其他网站部署操作也和以上布置大同小异,你可以自行搭建使用即可。

    六.php-fpm优化

    1.php.init优化

    1.打开php的安全模式,控制php执行危险函数, 默认是Off,改为On
    sql.safe_mode = Off
    2.关闭php头部信息, 隐藏版本号, 默认是On,改为Off
    expose_php = On
    3错误信息输出控制
    display_error = Off
    error_reporting = E_WARNING & E_ERROR
    4记录错误日志至后台, 方便追溯
    log_errors = On
    error_log = /var/log/php_error.log
    5.每个脚本时间最大内存
    memory_limit = 128M
    6.上传文件最大许可,默认2M, 建议调整为16,32M
    upload_max_filesize = 2M
    7.禁止远程执行phpshell,默认On, 建议Off
    allow_url_fopen = On
    8.时区调整,默认PRC, 建议调整为Asia/Shanghai
    date.timezone = PRC
    
    
    整体优化后配置文件
    sql.safe_mode = Off
    expose_php = Off
    display_error = Off
    error_reporting = E_WARNING & E_ERROR
    log_errors = On
    error_log = /var/log/php_error.log
    upload_max_filesize = 50M
    allow_url_fopen = Off
    date.timezone = Asia/Shanghai
    

    2.php-fpm配置详解

    [global]
    #pid设置, 记录程序启动后pid
    pid = /var/run/php-fpm.pid
    #php-fpm程序启动错误日志路径
    error_log = /soft/log/php/php-fpm_error.log
    # 错误级别. 可用级别为: alert(必须立即处理),error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.
    log_level = warning
    #设置文件打开描述符的rlimit限制.
    rlimit_files = 65535
    events.mechanism = epoll
    
    #启动进程的用户和组
    [www]
    user = www
    group = www
    
    # fpm监听端口
    listen = 127.0.0.1:9000
    # unix socket设置选项,如果使用tcp方式访问,这里注释即可。
    listen.owner = www
    listen.group = www
    # 允许访问FastCGI进程的IP,any不限制
    listen.allowed_clients = 127.0.0.1
    
    # pm设置动态调度
    pm = dynamic
    # 同一时刻最大的php-fpm子进程数量
    pm.max_children = 50
    # 动态方式下的起始php-fpm进程数量
    pm.start_servers = 20
    # 动态方式下服务器空闲时最小php-fpm进程数量
    pm.min_spare_servers = 10
    # 动态方式下服务器空闲时最大php-fpm进程数量
    pm.max_spare_servers = 30
    # 最大请求
    pm.max_requests = 1024
    pm.process_idle_timeout = 15s;
    
    # FPM状态页面,用于监控php-fpm状态使用
    pm.status_path = /status
    # 错误日志
    php_flag[display_errors] = off
    php_admin_value[error_log] = /soft/log/php/php-www_error.log
    php_admin_flag[log_errors] = on
    
    # 配置php慢查询, 以及慢查询记录日志位置
    request_slowlog_timeout = 5s
    slowlog = /soft/log/php/php-slow.log
    

    3.优化案例

    php-fpm配置文件 服务器配置4核16G 8核16G

    [root@nginx ~]# cat /etc/php-fpm.d/www.conf
    [global]
    pid = /var/run/php-fpm.pid
    #php-fpm程序错误日志
    error_log = /var/log/php/php-fpm.log
    log_level = warning
    rlimit_files = 655350
    events.mechanism = epoll
    
    [www]
    user = nginx
    group = nginx
    listen = 127.0.0.1:9000
    listen.owner = www
    listen.group = www
    listen.mode = 0660
     
    listen.allowed_clients = 127.0.0.1
    pm = dynamic
    pm.max_children = 512 #一个对应内存30m内存左右
    pm.start_servers = 10
    pm.min_spare_servers = 10
    pm.max_spare_servers = 30
    pm.process_idle_timeout = 15s;
     
    pm.max_requests = 2048
    
    #php-www模块错误日志
    php_flag[display_errors] = off
    php_admin_value[error_log] = /var/log/php/php-www.log
    php_admin_flag[log_errors] = on
    
    #php慢查询日志
    request_slowlog_timeout = 5s
    slowlog = /var/log/php/php-slow.log
    

    相关文章

      网友评论

        本文标题:部署LNMP

        本文链接:https://www.haomeiwen.com/subject/tngrbctx.html