部署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