PHP-FPM进程数调整,解决网站502网关错误
网站突然打不开,浏览器显示502 Bad Gateway,这是Nginx无法从PHP-FPM拿到响应时的典型表现。
多数情况下,并不是PHP代码坏了,而是PHP-FPM的进程数不够用,请求排队超时。
本文面向零基础用户,讲清楚怎么判断、怎么调整、怎么验证,让网站恢复稳定。
先确认是不是PHP-FPM进程不够用
502错误的原因很多,动手改配置前先做两步排查,避免白忙。
第一步,查看Nginx错误日志,确认上游连接失败。
在服务器上执行:
tail -n 50 /var/log/nginx/error.log
如果看到类似 connect() to unix: 或
/run/php/php-fpm.sock failedupstream timed out,
说明Nginx确实连不上PHP-FPM。
第二步,查看PHP-FPM自己的日志。
路径通常在 /var/log/php-fpm.log 或 /var/log/php-fpm/www-error.log:
tail -n 50 /var/log/php-fpm/www-error.log
出现 WARNING: [pool www] server reached pm.max_children setting 时,基本可以确定进程数被打满了。
也可以在宝塔面板操作:进入“软件商店”找到PHP版本,点击“设置”->“日志”,直接查看错误日志。
调整PHP-FPM进程数
PHP-FPM的进程管理有三种模式,先搞清楚区别再改:
- static:固定进程数,适合内存充足、流量稳定的场景。
- dynamic:动态调整,空闲时回收,适合大多数网站。
- ondemand:按需启动,省内存但响应稍慢,适合低流量站点。
打开对应PHP版本的配置文件。
命令行环境一般在 /etc/php/8.1/fpm/pool.d/www.conf,路径中的版本号按你实际安装的PHP版本调整。
宝塔面板路径为“软件商店”->PHP版本->“设置”->“配置修改”。
找到 pm 及相关参数,按下面示例修改:
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
参数怎么定?pm.max_children 是最关键的,它决定了同时能处理多少个PHP请求。
一个简单的估算方法:用服务器可用内存除以单个PHP进程平均占用内存。
比如可用内存2GB,单个进程约40MB,那么 2 * 1024 / 40 ≈ 51,设置50左右比较稳妥。
pm.max_requests 表示每个进程处理多少个请求后自动重启,能缓解内存泄漏,一般设500到1000。
注意:pm.max_children 不要超过服务器内存能承受的范围,否则容易触发OOM,反而导致整个服务崩溃。
保存后平滑重启并观察
配置改完后,不要直接重启服务器。
先检查配置语法是否正确:
php-fpm -t
如果显示 configuration file test is successful,再平滑重启PHP-FPM:
systemctl reload php8.1-fpm
版本号按实际情况替换。
宝塔面板直接点“服务”->“重载配置”即可。
重载后,用下面的命令观察进程数是否按预期变化:
ps aux | grep php-fpm | wc -l
或者查看PHP-FPM状态页(如果已开启):
curl http://127.0.0.1/status
状态页会显示 active processes 和 max children reached 等关键指标。
验证502是否真正解决
调整完不要立刻关掉终端,做几个验证动作:
- 用浏览器反复刷新之前报502的页面,观察是否稳定打开。
- 执行
tail -f /var/log/nginx/error.log,持续观察几分钟,确认不再出现上游连接失败。 - 如果网站有访问统计,对比调整前后的并发访问量,确认进程数能满足高峰需求。
如果502仍然出现,检查Nginx的 fastcgi_read_timeout 是否过短,以及PHP脚本本身是否有死循环或长时间阻塞。
几个容易踩的坑
只改数字不看内存:pm.max_children 设得过大,服务器内存被吃光,MySQL和Nginx也会被拖垮。
调整前先用 free -m 确认可用内存。
改了配置没重载:修改 www.conf 后必须重载PHP-FPM,否则配置不生效。
忽略慢查询和慢脚本:如果数据库查询很慢,再多的PHP进程也会被占满。
502反复出现时,要同时排查MySQL慢查询和PHP代码性能。
多个PHP版本搞混:服务器上装了多个PHP版本时,要确认Nginx实际使用的是哪个socket,改错配置文件等于没改。
常见疑问
调整进程数后需要重启Nginx吗?
一般不需要。PHP-FPM和Nginx是独立服务,重载PHP-FPM即可生效。如果Nginx配置也改过,再单独重载Nginx。
dynamic和static选哪个?
流量波动大选dynamic,能自动伸缩;流量稳定且内存充足选static,响应更一致。拿不准就先用dynamic。
调整后网站变快了吗?
如果之前是进程不够导致的排队,调整后响应会明显改善。但如果瓶颈在数据库或代码,进程数调整只能缓解,不能根治。
多少进程数才算合理?
没有固定答案,取决于内存、CPU和业务类型。建议从估算值起步,观察状态页的 max children reached 是否频繁出现,再逐步微调。
调整PHP-FPM进程数是解决502网关错误的常见手段,核心是让进程数与服务器内存和实际并发匹配。
按本文步骤先排查日志,再修改配置,最后验证效果,大多数502问题都能得到缓解。
如果问题依旧,建议借助官方文档或专业运维进一步分析。