5. LAMP架构进阶

2021-03-12  本文已影响0人  随便写写咯

4 php-fpm 模式实现LAMP

4.1 实现php-fpm(PHP FastCGI Proces Manager)模式

对于php请求,httpd可以用模块和fastcgi两种方式实现动态程序的支持。

fastcgi模式:php处理请求,不再由http服务器自身进行管理,http服务器把http协议转化为factcgi协议,通过socket发送给fastcgi专用进程处理php程序

从稳定性上看,fastcgi是以独立的进程池运行程序,如果单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑。从安全性上看,fastcgi和http的server完全独立, fastcgi故障不会影响web server

从性能上看,fastcgi把动态逻辑的处理从http server中分离出来,大负荷的IO处理还是留给宿主server,这样http server可以一心一意处理IO,对于一个普通的动态网页来说,逻辑处理可能只有一小部分,大量的图片等静态IO处理完全不需要逻辑程序的参与。
从扩展性上讲,fastcgi是一个中立的技术标准,完全可以支持任何语言写的处理程序,如php,java,python等。而php-fpm就是用来支持php的fastcgi服务器。

各种OS版本对fastcgi的支持

CentOS 8: 默认使用FastCGI模式

httpd-2.4:默认rpm包支持fcgi模块
php包: 默认使用fpm模式
php-fpm包:专用于将php运行于fpm模式

CentOS 7:

httpd-2.4:默认rpm包支持fcgi模块
php-fpm包:专用于将php运行于fpm模式

CentOS 6:

PHP-5.3.2之前:默认不支持fpm机制;需要自行打补丁并编译安装
httpd-2.2:默认不支持fcgi协议,需要自行编译此模块
解决方案:编译安装httpd-2.4, php-5.3.3+

4.2 安装php-fpm

4.2.1 CentOS 8 安装php-fpm

yum -y install php-fpm
yum -y install php

4.2.2 CentOS 7 BASE源安装php-fpm

yum -y install php-fpm

4.2.3 CentOS 7清华源yum安装较新版php-fpm(需要epel源)

实验案例:

在CentOS-7上利用清华源yum安装较新版php-fpm, 让php-fpm和apache运行在独立的服务器
在CentOS-8上安装httpd, 与php-fpm通过tcp:9000端口通讯
[root@centos7 ~]#yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm

#安装php-fpm5.6版
[root@centos7 ~]#yum install php56-php-fpm  php56-php-mysql

#安装php-fpm7.4版    
[root@centos7 ~]#yum install php74-php-fpm  php74-php-mysqlnd php74-php-opcache php74-php-json
[04:11:31 root@centos-7-6 ~]#systemctl enable --now php74-php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php74-php-fpm.service to /usr/lib/systemd/system/php74-php-fpm.service.
[04:12:29 root@centos-7-6 ~]#ss -ntl
State      Recv-Q Send-Q                                             Local Address:Port                                                            Peer Address:Port              
LISTEN     0      128                                                            *:22                                                                         *:*                  
LISTEN     0      100                                                    127.0.0.1:25                                                                         *:*                  
LISTEN     0      128                                                    127.0.0.1:9000    # 启动php-fpm后, 会监听在9000端口, 为了提供跨网络的FastCGI服务                                                           *:*                  
LISTEN     0      128                                                         [::]:22                                                                      [::]:*                  
LISTEN     0      100                                                        [::1]:25                                                                      [::]:*                  
[04:12:31 root@centos-7-6 ~]#

           ├─php-fpm(1244)─┬─php-fpm(1245)
           │               ├─php-fpm(1246)
           │               ├─php-fpm(1247)
           │               ├─php-fpm(1248)
           │               └─php-fpm(1249)

4.3 配置php-fpm

/etc/opt/remi/php74/php-fpm.conf # 主配置文件
/etc/opt/remi/php74/php-fpm.d/www.conf # 扩展配置文件
主配置文件选项

vim /etc/opt/remi/php74/php-fpm.conf
daemonize = yes # 是否将程序运行在后台, docker中要为no, 一般为yes
扩展配置文件

/etc/opt/remi/php74/php-fpm.d/www.conf

listen = 127.0.0.1:9000 # 定义了php-fpm默认监听9000端口  ---> listen = 9000 # 允许远程访问
...
; RPM: apache user chosen to provide access to the same directories as httpd                                                                                                        
user = apache # 安装php-fpm会自动创建apache用户, 即使没有安装httpd也会创建
; RPM: Keep a group allowed to write in log dir.
group = apache
listen.allowed_clients = 0.0.0.0  # 允许任何人连接, 默认是127.0.0.1
listen = /var/run/php.sock # UDS模式使用(apache和php-fpm程序在同一台服务器时可以通过Unix套接字通信), 指定生成的 Unix Socket文件的路径. UDS在httpd-2.4.7后引入
listen.owner = apache # UDS模式使用, 指定生成的Unix Socket文件的所有者
listen.group  = apache # UDS模式使用, 指定生成的Unix Socket文件的所属组
listene.mode = 0666 # UDS模式使用, 指定生成的Unix Socket文件的权限
listen.acl_users = apache, nginx # 指定用户访问Unix Socket文件, listen.owner和listen.group将无效
listen.backlog = -1 # 等待队列的长度 -1 表示无限制
pm = dynamic | static # static固定数量的子进程, dynamic子进程数量以动态模式管理
pm.max_children = 50 # 固定数量的子进程
pm.start_servers = 5 # 类似于apache预生成进程的配置
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/opt/remi/php74/lib/php/session # 设置session存放位置
access.log = log/$pool.access.log # 访问日志
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" # 访问日志格式
request_slowlog_timeout = 0 # 当一个请求到达该设置的超时时间后, 就会将对应的php调用堆栈信息完整写入到慢日志中, 设置为0, 表示off, 可用单位: s秒, m分, h小时, d天. 默认为s秒, 默认值为0关闭
slowlog = /var/opt/remi/php74/log/php-fpm/www-slow.log # 慢请求的记录日志
pm.status_path = /status # php-fpm的状态页面, 可以修改为/php-status, 来和apache的状态页面区分开
ping.path = /ping # 测试当前php-fpm是否存活

[21:15:05 root@centos-7-6 ~]#systemctl restart php74-php-fpm.service
LISTEN     0      128                                                         [::]:9000    # 开启900端口后, apache和php-fpm就可以运行在不同的服务器, 通过tcp协议来通讯                                                                 [::]:*  

4.4 配置httpd支持FastCGI

注意:在HTTPD服务器上必须启用proxy_fcgi_module模块,才能充当php-fpm客户端

CentOS-8上安装apache

[21:23:20 root@apache ~]#yum -y install httpd
[21:47:51 root@apache ~]#httpd -M | grep fcgi
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fe8c:d0f1. Set the 'ServerName' directive globally to suppress this message
 proxy_fcgi_module (shared)
图片.png

创建apache支持php-fpm的配置文件

[21:48:26 root@apache ~]#vim  /etc/httpd/conf.d/php-fpm.conf

<IfModule dir_module>
    DirectoryIndex index.php  index.html                                                                                                                                            
</IfModule>  # 指定, 当访问apache站点根路径/var/www/html, 默认会访问index.php文件l, 这样一旦访问根路径, 那么就会访问index.php页面, 配合第三行配置, 当访问以.php结尾的文件时, 就通过FCGI协议, 连接到10.0.0.187:9000/data/html目录下, 查找index.php程序
ProxyRequests Off # 关闭正向代理功能
ProxyPassMatch ^/(.*\.php)$ fcgi://10.0.0.187:9000/data/html/$1  # 这里的/data/html指的是FCGI服务器上, 存放php程序的路径, 可以自定义, 而不是apache服务器上的文件路径
#以上开启FCGI反向代理,“^/”这处的”/“是相对于后面的/data/html而言,后面的$1是指前面的/(.*.php). 当访问的是别的.php文件时, 也是交给10.0.0.187, 去/data/html目录和子目录找相应的php文件做处理
ProxyPassMatch ^/(php-status|ping) fcgi://10.0.0.187:9000 # 开启php-fpm状态页 # 状态页面路径要和php配置文件一致, 指定当用户访问/php-status时, 交给10.0.0.187上的php-fpm去处理

如果php-fpm和apache在同一台主机,也可以用 UDS(Unix Domain Socket)方式, 不过要求apache在2.4.9版本以上

ProxyPassMatch ^/(.*\.php)$ unix:/var/run/php.sock|fcgi://localhost/app/httpd24/htdocs/$1

注意: 当部署的服务, 既包括静态资源, 也包括动态资源, 并且是把apache和php-fpm部署在不同的服务器上时, 需要把软件包向apache的数据目录和php定义的数据目录都拷贝一份, 因为静态资源需要由apache处理, 只有动态的.php文件才需要转发给php-fpm处理
一般工作环境都会把apache和php-fpm放在一台服务器删部署, 不会分开
实际工作中, 需要与开发人员协调, 静态资源和动态资源的保存目录, 实现动静分离

4.5 实战案例

实现 CentOS 7 编译安装基于 FastCGI 模式的多虚拟主机的wordpress和discuzz的LAMP架构 

1. 环境准备

环境准备

两台主机:

    一台主机:apache+php(FastCGI模式) - CentOS 7 10.0.0.207
    一台主机:MySQL 5.7 服务器 - CentOS 7 10.0.0.197

软件版本:

    mysql-5.7.31-linux-glibc2.12-x86_64.tar 通用二进制格式
    apr-1.7.0.tar
    apr-util-1.6.1.tar
    httpd-2.4.46.tar
    php-7.4.10.tar
    wordpress-5.4.2-zh_CN.tar
    Discuz_X3.4_SC_UTF8_20210119

2. 编译安装httpd-2.4.46

[01:31:52 root@lap ~]#ll
total 37012
-rw-r--r-- 1 root root   872238 Sep  2  2020 apr-1.7.0.tar.bz2
-rw-r--r-- 1 root root   428595 Sep  2  2020 apr-util-1.6.1.tar.bz2
-rw-r--r-- 1 root root  7187805 Sep  2  2020 httpd-2.4.46.tar.bz2

安装步骤

https://www.jianshu.com/p/03bfd5c0fc46

验证

[01:52:12 root@lap ~/httpd-2.4.46]#curl localhost 
<html><body><h1>It works!</h1></body></html>

3. 编译安装MySQL 5.7.31

[01:32:48 root@mysql ~]#ls
mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz  mysql_install.sh
[01:42:55 root@mysql ~]#bash mysql_install.sh
yum -y install libaio numactl-libs
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
tar xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz -C /usr/local
cd /usr/local
ln -s mysql-5.7.31-linux-glibc2.12-x86_64 mysql
chown -R mysql.mysql /usr/local/mysql  #此处/usr/local/mysql/bin/mysql_secure_installation目录和内容的owner都不是mysql,需要修改

echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
mv /etc/my.cnf /etc/my.cnf.bak
cat >> /etc/my.cnf <<EOF
[mysqld]
datadir=/data/mysql
skip_name_resolve=1
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
EOF
mkdir -pv /data/mysql && chown -R mysql:mysql /data/mysql # 需要修改/data/mysql权限为mysql:mysql
mysqld --initialize --user=mysql --datadir=/data/mysql #mysqld --initialize会自动创建/data/mysql目录, 但是前提是其上级目录, /data事先存在, 因此要事先手动创建/data/mysql目录
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld  
chkconfig --add mysqld
service mysqld start
awk '/temporary password/{print $NF}' /data/mysql/mysql.log > /root/pd.txt

退出当前登录, 使环境变量生效

修改root密码

[01:56:27 root@database ~]#mysqladmin -uroot -p'EUOSqp<y=4RZ' password linux
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
mysql> select user, host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost | # 默认只有本地登录
+---------------+-----------+
3 rows in set (0.00 sec)

创建wordpress数据库, 创建wordpress用户

mysql> create database wordpress; 
Query OK, 1 row affected (0.00 sec)
mysql> grant all on wordpress.* to  wordpress@'10.0.0.%' identified by 'wordpress';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select user, host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| wordpress     | 10.0.0.%  |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)

4. 编译安装php-7.4

安装依赖包

[02:11:22 root@lap ~]#yum install gcc libxml2-devel bzip2-devel libmcrypt-devel sqlite-devel oniguruma-devel -y 
[02:11:39 root@lap ~]#ls
php-7.4.10.tar.gz

解压, 编译安装

[02:11:47 root@lap ~]#tar xf php-7.4.10.tar.gz 
[02:16:27 root@lap ~/php-7.4.10]#cd php-7.4.10/
#  --enable-fpm 指定以fpm模式运行
[02:16:27 root@lap ~/php-7.4.10]#./configure --prefix=/apps/php74 --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --with-zlib --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --enable-mbstring --enable-xml --enable-sockets --enable-fpm --enable-maintainer-zts --disable-fileinfo
[02:19:17 root@lap ~/php-7.4.10]#make && make install

修改php程序的PATH变量

[02:39:07 root@lap ~]#vim /etc/profile.d/lamp.sh

PATH=/apps/php74/bin:/app/httpd24/bin:$PATH                                                                                                                                                                               
[02:43:15 root@lap ~]#source /etc/profile.d/lamp.sh
[02:43:31 root@lap ~]#php --version
PHP 7.4.10 (cli) (built: Mar 12 2021 02:29:35) ( ZTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

准备php配置文件, 源码包提供配置模板

[02:44:26 root@lap ~]#cd php-7.4.10/
[02:45:09 root@lap ~/php-7.4.10]#ls
appveyor             buildconf            config.nice    CONTRIBUTING.md  include  main                modules              php.ini-production  sapi     TSRM                 Zend
azure                buildconf.bat        config.status  docs             libs     Makefile            NEWS                 README.md           scripts  UPGRADING
azure-pipelines.yml  CODING_STANDARDS.md  configure      ext              libtool  Makefile.fragments  pear                 README.REDIST.BINS  tests    UPGRADING.INTERNALS
build                config.log           configure.ac   EXTENSIONS       LICENSE  Makefile.objects    php.ini-development  run-tests.php       travis   win32
[02:45:10 root@lap ~/php-7.4.10]#cp php.ini-production /etc/php.ini

准备fpm的service文件, 官方提供模板, 无需修改

[02:45:21 root@lap ~/php-7.4.10]#cp sapi/fpm/php-fpm.service /lib/systemd/system

修改fpm的配置文件

[02:46:28 root@lap ~/php-7.4.10]#cd /apps/php74/etc
[02:47:22 root@lap /apps/php74/etc]#cp php-fpm.conf.default php-fpm.conf
[02:47:34 root@lap /apps/php74/etc]#cd php-fpm.d
[02:47:46 root@lap /apps/php74/etc/php-fpm.d]#cp www.conf.default www.conf
[02:47:53 root@lap /apps/php74/etc/php-fpm.d]#vim www.conf
listen = 127.0.0.1:9000   # apache和php-fpm在同一个服务器, 可以监听127地址即可
user = apache # 修改fpm运行用户
group = apache  #修改fpm运行组
pm.status_path = /php-status # 开启状态页
ping.path = /ping   # 开启ping测试

配置php-opcache加速器

[02:51:33 root@lap /apps/php74/etc/php-fpm.d]#mkdir /etc/php.d

[02:53:13 root@lap /apps/php74/etc/php-fpm.d]#vim /etc/php.d/opcache.ini

[opcache]
zend_extension=opcache.so
opcache.enable=1     

启动php-fpm

[02:53:49 root@lap /apps/php74/etc/php-fpm.d]#systemctl daemon-reload 
[02:55:06 root@lap /apps/php74/etc/php-fpm.d]#systemctl enable --now php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

安装准备工作完毕

[02:38:57 root@lap ~]#ll /app
total 0
drwxr-xr-x 15 root root 175 Mar 12 01:45 httpd24
[02:39:06 root@lap ~]#ll /apps
total 0
drwxr-xr-x 9 root root 88 Mar 12 02:30 php74
[02:55:34 root@lap ~]#ss -ntl
State      Recv-Q Send-Q                                             Local Address:Port                                                            Peer Address:Port              
LISTEN     0      128                                                            *:22                                                                         *:*                  
LISTEN     0      100                                                    127.0.0.1:25                                                                         *:*                  
LISTEN     0      128                                                    127.0.0.1:9000                                                                       *:*                  
LISTEN     0      128                                                         [::]:22                                                                      [::]:*                  
LISTEN     0      100                                                        [::1]:25                                                                      [::]:*                  
LISTEN     0      128                                                         [::]:80                                                                      [::]:* 

5. 修改apache配置文件支持php-fpm

[02:55:59 root@lap ~]#vim /app/httpd24/conf/httpd.conf 

#取消一下两行注释
LoadModule proxy_module modules/mod_proxy.so  
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so 

#修改访问apache的默认页面

<IfModule dir_module>
    DirectoryIndex index.php  index.html                                                                                                                                            
</IfModule>

#默认情况下, apache编译后不支持php, 需要添加MIME类型

AddType application/x-httpd-php .php

# 关闭正向代理, 使用反向代理
ProxyRequests off  

6. 添加第一个虚拟主机, 支持wordpress

[03:11:01 root@lap ~]#vim /app/httpd24/conf/httpd.conf 

<virtualhost *:80>
servername wordpress.wang.org
documentroot /data/wordpress
<directory /data/wordpress>
require all granted
</directory>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/data/wordpress/$1
# 实现status和ping页面
ProxyPassMatch ^/(php-status|ping)$ fcgi://127.0.0.1:9000/$1                                                                                                                        
CustomLog "logs/access_wordpress_log" common
</virtualhost>

[03:11:12 root@lap ~]#ls
wordpress-5.4.2-zh_CN.tar.gz
[03:12:15 root@lap ~]#mv wordpress /data/
[03:12:23 root@lap ~]#chown -R apache.apache /data/wordpress/
[03:13:03 root@lap ~]#ll /data
total 4
drwxr-xr-x 5 apache apache 4096 Aug  3  2020 wordpress
[03:13:06 root@lap ~]#systemctl restart httpd

测试ping页面

测试fpm状态页面

图片.png

测试访问10.0.0.207, 可以访问到wordpress登录页面

图片.png

不过因为使用的是虚拟主机, 所以要用域名登录wordpress, 进行配置, 如果直接使用ip地址登录进行配置, 那么之后就无法使用域名访问了

修改Windows本地hosts文件

10.0.0.207 wordpress.wang.org
图片.png 图片.png 图片.png 图片.png

7. 添加第二个虚拟主机, 支持discuzz

[03:30:18 root@lap ~]#vim /app/httpd24/conf/httpd.conf

<virtualhost *:80>
servername discuzz.wang.org
documentroot /data/discuzz
<directory /data/discuzz>
require all granted
</directory>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/data/discuzz/$1
CustomLog "logs/access_discuzz_log" common
</virtualhost>

添加域名解析

10.0.0.207 wordpress.wang.org discuzz.wang.org

重启apache

[03:33:55 root@lap ~]#systemctl restart httpd

准备discuzz文件

[03:43:20 root@lap ~]#mv Discuz_X3.4_SC_UTF8_20210119.zip  /opt
[03:43:20 root@lap ~]#cd /opt
[03:42:54 root@lap /opt]#tar xf Discuz_X3.4_SC_UTF8_20210119.zip 
[03:44:45 root@lap /opt]#ls
Discuz_X3.4_SC_UTF8_20210119.zip  qqqun.png  readme  readme.html  upload  utility
# 只需要upload目录即可

[03:44:46 root@lap /opt]#mv upload/ /data/discuzz
[03:45:14 root@lap /opt]#ll /data
total 8
drwxr-xr-x 13 root   root   4096 Jan 19 21:06 discuzz
drwxr-xr-x  5 apache apache 4096 Mar 12 03:26 wordpress
[03:45:28 root@lap /opt]#chown apache.apache /data/discuzz -R

浏览器测试访问

图片.png

8. 将tcp通信改成UDS通信

因为是把apache和php-fpm都部署在了同一个服务器, 因此apache可以和php-fpm通过Unix套接字通信

修改fpm配置文件

[03:51:00 root@lap ~]#vim /apps/php74/etc/php-fpm.d/www.conf

listen = /var/run/php-fpm.sock
listen.owner = apache
listen.group = apache
listen.mode = 0660  

重启fpm服务

[03:53:29 root@lap ~]#systemctl restart php-fpm

# 不在监听9000端口

[03:53:51 root@lap ~]#ss -ntl
State      Recv-Q Send-Q                                             Local Address:Port                                                            Peer Address:Port              
LISTEN     0      128                                                            *:22                                                                         *:*                  
LISTEN     0      100                                                    127.0.0.1:25                                                                         *:*                  
LISTEN     0      128                                                         [::]:22                                                                      [::]:*                  
LISTEN     0      100                                                        [::1]:25                                                                      [::]:*                  
LISTEN     0      128                                                         [::]:80                                                                      [::]:*   
[03:54:08 root@lap ~]#ll /var/run/php-fpm.sock 
srw-rw---- 1 apache apache 0 Mar 12 03:53 /var/run/php-fpm.sock

修改apache配置文件

# 这里只修改wordpress虚拟主机

#ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/data/wordpress/$1
#ProxyPassMatch ^/(php-status|ping)$ fcgi://127.0.0.1:9000/$1
ProxyPassMatch ^/(.*\.php)$ "unix:/var/run/php-fpm.sock|fcgi://localhost/data/wordpress"
ProxyPassMatch ^/(php-status|ping)$ "unix:/var/run/php-fpm.sock|fcgi://localhost"  
[03:57:39 root@lap ~]#systemctl restart httpd

验证能正常访问即可

图片.png

UDS会稍微比本地127性能好一些, 但是区别不是很大

上一篇下一篇

猜你喜欢

热点阅读