009.YUM安装LNMP
LNMP架构
nginx服务本身无法处理动态请求,当用户发起http请求时,如果是静态资源请求,nginx会直接返回资源给用户,动态请求则是通过fastcgi协议将请求转交给后端的PHP程序处理

- 用户通过http协议发起请求,http请求会访问80端口,所以请求会先到达Nginx
- Nginx根据用户的请求进行location规则匹配
- location匹配到静态请求,则Nginx读取本地资源返回用户
- location匹配到动态请求,则Nginx将请求转发给fastcgi协议
- fastcgi收到请求后转交给php-fpm管理进程,php-fpm收到请求后会调用具体的工作进程warrap
- warrap进程会调用php程序进行解析,如果只是解析代码,php直接返回
- 如果用户的请求中需要查询数据库,由php连接数据库(用户、密码、IP)发起查询操作
- 最终数据由MySQL -> PHP -> php-fpm -> fastcgi -> nginx -> http -> user
在fastcgi与php-fpm之间,fastcgi也等同于是一个‘Client’,向‘Server’的php-fpm发起请求,而php-fpm本身作为管理进程,它不对请求做任何处理,而是转交给具体的工作进程warrap;如果用户的请求需要查询数据库,也就是PHP要连接数据库,前提是需要根据不同的数据库先安装PHP的数据库连接模块
php-fpm.conf是php-fpm管理程序的配置文件,它能够控制PHP能够启动多少个进程;php.ini是PHP解析器的配置文件,它能够控制PHP最大能够上传多大的文件、是否允许上传恶意文件等
LNMP安装(YUM)
Nginx
- Nginx安装
nginx官网提供了对应各种Linux发行版和不同的安装方式,以rhel为例,yum安装nginx




- Nginx开机自启
[root@web01 ~]# systemctl enable nginx
[root@web01 ~]# systemctl restart nginx
PHP
- 使用第三方源安装PHP
[root@web01 ~]# yum list installed | grep "php"
[root@web01 ~]# yum remove php php-cli php-common
- 新建PHP的yum配置文件(使用第三方yum源)
[root@web01 ~]# vim /etc/yum.repos.d/php.repo
[php]
name = php Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
webtatic是一个免费的开yum源项目,它包含更新的web服务的各类软件包,centos和aliyun的没有较新版本的PHP的yum源。如果此前已经使用了其他的第三方yum源,最好先删除原来的第三方yum源、如果此前已经安装好了相应的软件,最好先删除这些软件而不是使用第三方yum源对他们进行升级
- 安装php
[root@web01 ~]# yum install -y php71w php71w-cli php71w-fpm php71w-mysqlnd php71w-opcache
php71w: php主程序
php71w-cli: php命令行工具
php71w-fpm: php-fpm管理程序
php71w-mysqlnd: mysql数据库连接工具
php71w-opcache: 加速工具
- 开机自启
[root@web01 ~]# systemctl start php-fpm
[root@web01 ~]# systemctl enable php-fpm
使用第三方yum源安装的软件包名称后面都有71w后缀,例如php71w、php71w-cli,71表示php版本7.1、w表示webtatic的首字母
MariaDB
安装MariaDB
[root@web01 ~]# yum install -y mariadb-server mariadb
[root@web01 ~]# systemctl start mariadb
[root@web01 ~]# systemctl enable mariadb
[root@web01 ~]# mysqladmin password 'redhat'; # 为mariadb配置登录密码
LNMP集成环境配置
FastCGI配置语法
将Nginx与PHP集成过程中,需要先了解FastCGI模块的代理配置语法
- 设置fastcgi服务器的地址,该地址可以指定为域名或IP、端口
# 1.指令
Syntax: fastcgi_pass address;
Default: -
Context: location, if in location
# 2.示例
fastcgi_pass localhost:9000; # php-fpm进程默认监听9000端口
fastcgi_pass unix:/tmp/fastcgi.socket; # 这种方式只适用nginx与php在同主机的场景
- 设置fastcgi默认的首页文件,需要结合fastcgi_param一起设置
Syntax: fastcgi_index name;
Default: -
Context: http, server, location
- 通过fastcgi_param设置变量,将设置的变量传递到后端的fastcgi服务器
# 1.指令
Syntax: fastcgi_param parameter value [if_not_empty];
Default: -
Context: http, server, location
# 2.示例
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /code$fastcgi_script_name;

用户的动态请求到nginx,nginx通过fastcgi转到PHP的过程中,需要向PHP解析器声明用户请求的资源的真实路径。nginx通过fastcgi_param指令将用户请求的资源路径发送到PHP解析器,SCRIPT_FILENAME是PHP的变量,不能修改,$document_root表示root关键词所定义的根目录路径,$fastcgi_script_name表示用户请求的文件名
此示例中,$document_root是‘/code’,$fastcgi_script_name是‘index.php’,所以PHP解析的真实路径是‘/code/index.php’
nginx集成php
- 整理nginx配置文件
# 仅保留默认的default配置文件,其他配置文件全部删除
[root@web01 ~]# ls /etc/nginx/conf.d/ | grep -v "default" | xargs -n 1 | sed 's#.*#rm -f /etc/nginx/conf.d/&#g' | bash
# 清理多余路径
[root@web01 ~]# \rm -r /opt/{code*,hebor*}
- 新建集成php配置文件
[root@web01 ~]# vim /etc/nginx/conf.d/php.conf
[root@web01 ~]# more /etc/nginx/conf.d/php.conf
server {
listen 80;
server_name web01.example.com;
charset utf-8,gbk;
root /opt/php/;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # php默认监听本地9000端口
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # $document_root能够调用全局的root路径
include fastcgi_params;
}
}
[root@web01 ~]# systemctl restart nginx
[root@web01 ~]# systemctl start php-fpm
[root@web01 ~]# systemctl enable php-fpm
include fastcgi_params;是一个相对路径,相对于nginx的安装目录,绝对路径是/etc/nginx/fastcgi_params,fastcgi_params文件中保存的是要传给后端PHP的变量与值的对应关系,如果配置文件中没有添加这个配置,变量传不到PHP解析器,解析出来的PHP页面就是空白页面
如果nginx与php安装在同一台主机上,也可以修改php配置文件/etc/php-fpm.d/www.conf,设置listen = /tmp/fastcgi.socket,然后修改nginx配置文件的fastcgi_pass地址即可
- 测试nginx与php集成是否成功
[root@web01 ~]# mkdir /opt/php
[root@web01 ~]# vim /opt/php/page.php
<?php
phpinfo();
?>
php集成mariadb
新建php测试连接数据库文件
[root@web01 ~]# vim /opt/php/mysqli.php
<?php
$servername = "localhost";
$username = "root";
$password = "redhat";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检测连接
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "php连接MySQL数据库成功";
?>
基于LNMP的开源项目
开源项目可以继续深入了解学习,也可以用于简单检测一下LNMP的学习成果,常见的基于LNMP的开源项目有:phpmyadmin、zblog、discuz、wordpress、wecenter、edusoho
wordpress
安装wordpress时不要随意更改相应的nginx的配置文件的域名,因为wordpress的数据库内把域名写死了,如果一定要修改域名,需要注意nginx和wordpress的数据库同步
- 新建wordpress配置文件
[root@web01 ~]# cp /etc/nginx/conf.d/php.conf /etc/nginx/conf.d/wordpress.example.com.conf
[root@web01 opt]# diff /etc/nginx/conf.d/php.conf /etc/nginx/conf.d/wordpress.example.com.conf
3c3
< server_name web01.example.com;
---
> server_name wordpress.example.com;
5c5
< root /opt/php/;
---
> root /opt/code/wordpress/;
只修改了域名和站点目录
- 根据配置文件部署站点
[root@web01 ~]# mkdir /opt/wordpress
[root@web01 ~]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
[root@web01 ~]# tar -xzf latest-zh_CN.tar.gz -C /opt/code/
- 修正nginx和php-fpm的所属用户权限
[root@web01 opt]# ps aux | grep "nginx" # 查看nginx进程的所属用户
[root@web01 opt]# ps aux | grep "php-fpm" # 查看php-fpm进程的所属用户
[root@web01 opt]# sed -i '/^user/c user www;' /etc/nginx/nginx.conf # 修改nginx的所属用户
[root@web01 opt]# sed -i '/^user/cuser = www' /etc/php-fpm.d/www.conf # 修改php-fpm的所属用户和所属组
[root@web01 opt]# sed -i '/^group/cgroup = www' /etc/php-fpm.d/www.conf
[root@web01 opt]# chown -R www.www /opt/code/wordpress/
[root@web01 opt]# systemctl restart nginx
[root@web01 opt]# systemctl restart php-fpm
如果系统中没有‘www’用户,服务启动一定会报错
- wordpress安装向导
[root@web01 ~]# mysql -uroot -predhat # 准备wordpress数据库
MariaDB [(none)]> CREATE DATABASE wordpress;
# 然后登录web页面根据wordpress向导页面安装
[root@web01 ~]# more /opt/code/wordpress/wp-config.php # 此文件中包含wordpress的参数信息,不能出错
- wordpress上传文件
wordpress主题可以直接通过仪表盘下载,也可以上传本地主题文件。上传文件会涉及到nignx和php的限制,nginx的核心模块ngx_http_core_module下的client_max_body_size指令,默认仅允许上传1M大小的文件;php配置文件默认仅允许上传2M大小的文件
在未修改nginx配置文件的前提下上传大于1M的文件,nginx会返回413错误,
# 1.修改nginx上传限制
[root@web01 ~]# more /etc/nginx/conf.d/wordpress.example.com.conf
server {
listen 80;
server_name wordpress.example.com;
charset utf-8,gbk;
root /opt/code/wordpress/;
client_max_body_size 100m;
...
}
# 2.修改php上传限制
[root@web01 ~]# vim /etc/php.ini
post_max_size = 100M
upload_max_filesize = 100M
...
wecenter
此处使用wecenter3版本兼容PHP7.1,wecenter4版本需要PHP>=7.4
- 修改nginx配置文件
[root@web01 ~]# cd /etc/nginx/conf.d/
[root@web01 conf.d]# cp wordpress.example.com.conf wecenter.example.com.conf
[root@web01 conf.d]# diff wordpress.example.com.conf wecenter.example.com.conf
3c3
< server_name wordpress.example.com;
---
> server_name wecenter.example.com;
5c5
< root /opt/code/wordpress/;
---
> root /opt/code/wecenter/;
- 代码上线
wecenter官网下载软件包
[root@web01 ~]# mkdir /opt/code/wecenter
[root@web01 ~]# mv WeCenter\ V3.6.2.zip /opt/code/wecenter/
[root@web01 ~]# cd /opt/code/wecenter
[root@web01 wecenter]# unzip WeCenter\ V3.6.2.zip
- 修正权限
[root@web01 wecenter]# chown -R www.www /opt/code/wecenter/
- wecenter安装引导

wecenter安装向导页面可以看到还缺少了两个PHP依赖包,通过yum安装的PHP缺少依赖包时,直接使用yum安装依赖包即可;如果编译安装PHP缺少依赖包,那么所有参数都需要重新编译一次
# 1.安装PHP缺少的依赖
[root@web01 wecenter]# yum install -y php71w-gd freetype-devel
[root@web01 wecenter]# systemctl restart php-fpm
# 2.创建数据库
[root@web01 wecenter]# mysql -uroot -predhat
MariaDB [(none)]> CREATE DATABASE wecenter;
LNMP小结
- nginx与php在同一主机的场景下,既可以通过IP:PORT的方式集成、也可以通过本地socket文件的方式集成,两者IP方式适用范围更广、socket方式省去了TCP三次握手过程速度更快
- 如果关闭后端PHP访问nginx时会出现502错误,即便后端从PHP换成Python也是如此
- nginx+php与apache+php的区别,nginx以fastcgi协议调用php,两者更像是平行的服务,修改两者任意一个配置文件都不会对另一个产生影响;apache以模块的方式加载的php,使用yum安装php时会自动整合成为apache的一个模块,重启apache时也就等于重启了php

浙公网安备 33010602011771号