php-fpm全名是PHP FastCGI进程管理器;Nginx本身不能执行PHP程序,因此需要依赖FastCGI对PHP程序进行解释执行;如下图:
/etc/php-fpm.conf
是php-fpm的主配置文件,/etc/php-fpm.d/www.conf
是其它配置文件;
/etc/php-fpm.d
目录下的所有配置文件在主配置文件 /etc/php-fpm.conf
中被引入,类似Nginx的配置文件形式。
php-fpm启动后会先读php.ini,再读php-fpm配置,php-fpm会覆盖php.ini配置;
php-fpm启动后会创建一个master进程,监听9000端口(可配置),master进程根据/etc/php-fpm.d/www.conf
配置创建若干子进程,子进程用于处理实际业务;当有客户端(比如nginx)来连接9000端口时,空闲子进程会自己去接收处理,若子进程全部处于忙碌状态,新进的待accept连接会被master放进队列里,等待fpm子进程空闲;这个存放待accept的半连接的队列长度由 listen.backlog 配置。
安装PHP-FPM,以使用nginx支持php项目(PHP 与 PHP-FPM 版本必须保持一致)
## 安装
yum -y install php-fpm
## 启动
systemctl start php-fpm
## 开机启动
systemctl enable php-fpm
## 查看运行情况
netstat -nlpt | grep php-fpm
## 查看php-frpm版本,以及是否安装成功
php-fpm -v
## 输出结果如下:
PHP 7.3.33 (fpm-fcgi) (built: Nov 16 2021 11:18:28)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.33, Copyright (c) 1998-2018 Zend Technologies
with Xdebug v3.0.4, Copyright (c) 2002-2021, by Derick Rethans
常用命令:
## 启动
systemctl start php-fpm
## 重启
systemctl restart php-fpm
## 开机启动
systemctl enable php-fpm
## 状态,可查看当前运行的所有子进程、空闲进程、请求数量、数据流量等
systemctl status php-fpm
## 检查配置
php-fpm -t
server {
listen 443 ssl http2 default backlog=1024;
server_name admin.sidoc.cn;
charset utf-8;
## 匹配所有请求
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
## 匹配后缀为.php的请求
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000; ## 设置FastCGI服务器的地址
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; ## 向fastcgi传递请求参数
include fastcgi_params; ## 引入fastcgi_params内的配置
}
}
1. 为了节约内存,应尽量减少PHP模块的安装数量
2. 调高 linux 内核能够打开的文件数量
## a.查看Linux内核最多能打开的文件数量
ulimit -n
## b.执行如下命令,提高上限
echo ulimit -HSn 65536 >> /etc/profile
echo ulimit -HSn 65536 >> /etc/rc.local
## b.使用之生效
source /etc/profile
## c.验证
ulimit -n
以上若未能生,可以在 /etc/security/limits.conf 文件的最后加上如下两句:
soft nofile 51200
hard nofile 51200
Nginx收到客户端请求后,会将请求转到监听在9000端口上的php-fpm,然后php-fpm的子进程处理请求,若php-fpm的所有子进程全部处于忙绿状态,则php-fpm会将新进的请求放进队列里,等待fpm子进程空闲时处理;这个存放待accept的半连接的队列长度由 listen.backlog 字段配置;如果请求在backlog队列中等待时间过久,会导致Nginx报“504 gateway timeout”超时错误;如果Nginx报请求超时后,php-fpm才处理完请求返回给nginx,会因为TCP连接已经断开而报“Broken pipe”错误;如果backlog队列长度设定的太小,很快就被待accept的请求占满,则新进的请求将无法被php-fpm接收处理,会导致nginx报“502 Bad Gateway”错误。
通常建议将 listen.backlog 设定在 1024 以上,如下是配置方式:
在 nginx 配置的端口监听后加“default backlog=1024”,如下:
listen 80 default backlog=1024;
在php-fpm中配置 listen.backlog 为 1024
listen.backlog 1024
可同时开启多个php-fpm进程来处理请求,一个php-fpm进程同一时间只能处理一个请求;php-fpm的进程管理有两个方式,即动态管理和静态管理;
动态进程管理:是php-fpm根据请求数量自动动态调整进程数量,以满足实际需要;跟 Apache 一样,运行的 PHP 程序执行完成后,或多或少都会有内存泄露,这也是为什么开始一个进程只占 3M 左右内存,运行一段时间后就会上升到 20-30M 的原因了;所以在配置进程数量时,通常以一个进程占用30M内存来进行计算。
静态进程管理:是在配置中设定一个固定的进程数量,php-fpm就一直使用这些固定数量的进程来处理请求;此法不需要动态控制进程数量,因此性能和稳定性都相对较好,推荐使用。
由于一个进程最大可能占用30M内存,因此用本机内存大小除以30M,就能得到本机能够开启的最大进程数量;例如,以2G内存的电脑为例,其能够开启的进程数量为:2048M/30M ≈ 68;配置如下:
## 打开配置文件
## 静态进程管理方式
pm = static
## 静态方式下配置 php-fpm 进程数量
pm.max_children = 68;
pm.max_requests = 10240;
当一个php-cgi进程处理的请求数达到这个配置后,则会自动重启该进程,将内存释放给操作系统,避免内存泄漏导致系统宕机。
vim /etc/php-fpm.d/www.conf
找到以下三行代码并修改如下
user = nginx group = nginx listen.owner = nignx listen.group = nginx listen.mode = 0660
slowlog = /var/log/php-fpm/www-slow.log request_slowlog_timeout = 3s
当某个请求的时间超过了3秒,就会在慢日志中记录相应的记录,注意上面的时间3s,不能忽略了单位,相应的还有其他单位,m分,h时;
https://www.xiaole88.com/archives/58/