009.YUM安装LNMP

LNMP架构

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

LNMP.png

  1. 用户通过http协议发起请求,http请求会访问80端口,所以请求会先到达Nginx
  2. Nginx根据用户的请求进行location规则匹配
  3. location匹配到静态请求,则Nginx读取本地资源返回用户
  4. location匹配到动态请求,则Nginx将请求转发给fastcgi协议
  5. fastcgi收到请求后转交给php-fpm管理进程,php-fpm收到请求后会调用具体的工作进程warrap
  6. warrap进程会调用php程序进行解析,如果只是解析代码,php直接返回
  7. 如果用户的请求中需要查询数据库,由php连接数据库(用户、密码、IP)发起查询操作
  8. 最终数据由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

  1. Nginx安装

nginx官网提供了对应各种Linux发行版和不同的安装方式,以rhel为例,yum安装nginx

Nginx-1.png

Nginx-2.png

Nginx-3.png

Nginx-4.png

  1. Nginx开机自启
[root@web01 ~]# systemctl enable nginx
[root@web01 ~]# systemctl restart nginx

PHP

  1. 使用第三方源安装PHP
[root@web01 ~]# yum list installed | grep "php"
[root@web01 ~]# yum remove php php-cli php-common
  1. 新建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源对他们进行升级

  1. 安装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: 加速工具
  1. 开机自启
[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模块的代理配置语法

  1. 设置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在同主机的场景
  1. 设置fastcgi默认的首页文件,需要结合fastcgi_param一起设置
Syntax: fastcgi_index name;
Default: -
Context: http, server, location
  1. 通过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;

FastCGI代理配置

用户的动态请求到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

  1. 整理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*}
  1. 新建集成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地址即可

  1. 测试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的数据库同步

  1. 新建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/;

只修改了域名和站点目录

  1. 根据配置文件部署站点
[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/
  1. 修正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’用户,服务启动一定会报错

  1. wordpress安装向导
[root@web01 ~]# mysql -uroot -predhat       # 准备wordpress数据库
MariaDB [(none)]> CREATE DATABASE wordpress;

# 然后登录web页面根据wordpress向导页面安装
[root@web01 ~]# more /opt/code/wordpress/wp-config.php      # 此文件中包含wordpress的参数信息,不能出错
  1. wordpress上传文件

wordpress主题可以直接通过仪表盘下载,也可以上传本地主题文件。上传文件会涉及到nignx和php的限制,nginx的核心模块ngx_http_core_module下的client_max_body_size指令,默认仅允许上传1M大小的文件;php配置文件默认仅允许上传2M大小的文件

在未修改nginx配置文件的前提下上传大于1M的文件,nginx会返回413错误,

client_max_body_size文档

# 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

  1. 修改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/;
  1. 代码上线

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
  1. 修正权限
[root@web01 wecenter]# chown -R www.www /opt/code/wecenter/
  1. wecenter安装引导

补充PHP依赖包

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小结

  1. nginx与php在同一主机的场景下,既可以通过IP:PORT的方式集成、也可以通过本地socket文件的方式集成,两者IP方式适用范围更广、socket方式省去了TCP三次握手过程速度更快
  2. 如果关闭后端PHP访问nginx时会出现502错误,即便后端从PHP换成Python也是如此
  3. nginx+php与apache+php的区别,nginx以fastcgi协议调用php,两者更像是平行的服务,修改两者任意一个配置文件都不会对另一个产生影响;apache以模块的方式加载的php,使用yum安装php时会自动整合成为apache的一个模块,重启apache时也就等于重启了php
posted @ 2023-06-19 09:19  hebo  阅读(5)  评论(0)    收藏  举报