程序猿的进阶屋lnmp

部署LNMP

2019-11-04  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读