PHP-FPM的一些配置记录

2021-04-23 14:38:16

可以先简单看一下,官方文档: https://www.php.net/manual/zh/install.fpm.configuration.php

1. listen通讯方式

fpm配置

// tcp socket
listen = 127.0.0.1:9000 
// unix socket 
// 这里的php-fpm.sock可以放在 /dev/shm 目录,/dev/shm/是一个内存的目录,相对读写的速度会快一点。
// 需要注意php-fpm和nginx配置的权限
// sudo touch /dev/shm/php-fpm.sock
// sudo chown www:www /dev/shm/php-fpm.sock
// sudo chmod 775 /dev/shm/php-fpm.sock
listen = /tmp/php-fpm.sock 
nginx配置
location ~ .php$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
    fastcgi_pass 127.0.0.1:9000;
    //fastcgi_pass unix:/tmp/php-fpm.sock;
    fastcgi_index index.php;
}

比较:

unix socket方式要比tcp的方式快而且消耗资源少,因为socket在nginx和php-fpm的进程之间通信,而tcp需要经过本地回环驱动,还要申请临时端口和tcp相关资源。但是unix socket会显得不是那么稳定,当并发连接数爆发时,会产生大量的长时缓存,在没有面向连接协议支撑的情况下,大数据包很有可能就直接出错并不会返回异常。而TCP这样的面向连接的协议,可以保证通信的正确性和完整性。

如何选择?

如果nginx和php-fpm都在同一台机器,两种方式都可以使用;但是如果nginx和php-fpm不在同一台机器,又不想在每个机器装Nginx就只能选择tcp socket方式。

ps: 一般情况我会选择unix socket方式部署项目,因为项目流量不大,至于负载均衡每个节点服务器安装nginx+php-fpm

2.性能相关配置

// 运行模式: 可用值:static,ondemand,dynamic ,一般选dynamic,(当项目请求稳定在一个范围可以使用static,减少进程频繁切换的开销,根据项目情况配置)
pm = dynamic
// 允许创建的最大子进程数
pm.max_children = 50
// 起始进程数 仅在 pm 设置为 dynamic 时使用
pm.start_servers = 10
// 最小空闲进程数(清理后保留的进程数),仅在 pm 设置为 dynamic 时使用
pm.min_spare_servers = 5
// 最大空闲服务进程的最大数目 仅在 pm 设置为 dynamic 时使用
pm.max_spare_servers = 15
// 单个请求的超时中止时间(单位默认s),建议不要设置太大
request_terminate_timeout = 30
// 请求执行超过多少时间记录为慢日志(单位默认s)
request_slowlog_timeout = 30
// 慢日志记录文件 $pool为进程池名称、下文会说明何为进程池
slowlog = /opt/www/$pool.slow.log

php-fpm状态页选项,开启后可查看PHP-FPM的详细运行状态,给PHP-FPM优化带来帮助。

pm.status_path = /phpfpm_status

查看状态:

// nginx配置
server {
	listen 80;
	server_name 127.0.0.1;
	allow 127.0.0.1;
    location /phpfpm_status {
        fastcgi_pass unix:/tmp/php-cgi.sock;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
	}
 }
 
// 获取状态信息: 
curl http://127.0.0.1/phpfpm_status

字段说明

pool php-fpm pool的名称,大多数情况下为www
process manager 进程管理方式,建议配置为dynamic
start time php-fpm上次启动的时间
start since php-fpm已运行了多少秒
accepted conn pool接收到的请求数
listen queue 处于等待状态中的连接数,如果不为0,需考虑增加php-fpm进程数
max listen queue 从php-fpm启动到现在处于等待连接的最大数量
listen queue len 处于等待连接队列的套接字大小
idle processes 处于空闲状态的进程数
active processes 处于活动状态的进程数,如果活动进程数太小 空闲太多 可以将最大空闲进程数调小一些
total processess 进程总数
max active process 从php-fpm启动到现在最多有多少进程处于活动状态
max children reached 当pm试图启动更多的children进程时,却达到了进程数的限制,达到一次记录一次,如果不为0,需要增加php-fpm pool进程的最大数
slow requests 当启用了php-fpm slow-log功能时,如果出现php-fpm慢请求这个计数器会增加,一般mysql慢查询、请求第三方接口会导致记录为慢日志

配置举例:

......
[www1]
user = www
group = www
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
request_terminate_timeout = 30
request_slowlog_timeout = 30
slowlog = /opt/www/$pool.slow.log

[www2]
listen = /dev/shm/php-fpm.sock
user = www
group = www
pm = dynamic
pm.status_path = /phpfpm_72_status
pm.max_children = 250
pm.start_servers = 50
pm.min_spare_servers = 30
pm.max_spare_servers = 140
request_terminate_timeout = 100
request_slowlog_timeout = 30
slowlog = var/log/slow.log
......

以上例子中的: www1 www2即为php-fpm进程池的名称

一般情况只会配置一个池,建议可以按照项目配置池,重启看一下进程长啥样子.....

就写到这,还原配置去了......

本文由"putyy"原创,转载无需和我联系,但请注明来自putyy
您的浏览器不支持canvas标签,请您更换浏览器