PHP-FPM性能优化关键在合理配置进程管理模式与参数:先观察负载(systemctl status、php-fpm -t、slowlog、错误日志),再依场景选static/dynamic/ondemand模式,科学计算max_children,配合Nginx的fastcgi超时、socket连接及缓冲设置,最后reload验证。
PHP-FPM 的性能瓶颈往往不在代码本身,而在于进程管理配置不合理。调高进程数不等于提升并发能力,关键是要匹配服务器资源与请求特征,选对 pm 模式并精细调参。
别一上来就改 www.conf。先用命令观察真实运行状态:
systemctl status php-fpm 看服务是否正常、有无频繁重启sudo php-fpm -t 验证配置语法正确性sudo tail -f /var/log/php-fpm/www-slow.log 查看慢请求(需开启 slowlog)sudo systemctl status php7.4-fpm -l(版本按实际替换)看最近错误日志三种模式适用场景差异明显,不是越高越好:
pm.max_children = 32 后,始终占用约 32 个 PHP 进程内存。
最常用。根据负载自动伸缩,兼顾响应与资源节约。推荐中小流量网站:pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
max_requests 防止内存泄漏累积。公式参考:max_children ≈ 总内存 × 0.7 ÷ 单个 PHP 进程平均内存
立即学习“PHP免费学习笔记(深入)”;
ps aux --sort=-%mem | grep "php-fpm" | head -10 查看几个活跃进程的 RSS 内存(单位 KB)4096 × 0.7 ÷ 45 ≈ 63,向下取整设为 60
worker_connections 和反向代理超时时间,避免 FPM 进程被占满后 Nginx 返回 502FPM 配置再优,Nginx 没配好也白搭:
fastcgi_pass 推荐用 Unix socket(如 unix:/run/php/php7.4-fpm.sock),比 TCP 更快更稳定location ~ \.php$ 块中加上:fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_connect_timeout 30;
fastcgi_buffering off;(慎用)仅当输出大文件或流式响应时考虑,否则关闭缓冲会增加 FPM 压力基本上就这些。调完记得 reload 服务:sudo systemctl reload php-fpm && sudo nginx -s reload,再压测验证效果。不复杂但容易忽略细节。