宝塔面板经常报 502 Bad Gateway?排查思路与参数配置记录

核心导读:记一次云服务器偶尔出现 502 报错的排查过程,整理了针对 1G 到 4G 内存机器的 PHP-FPM 与 Swap 优化参数,以及恶意请求防御方案,供个人备忘与参考。

最近在维护一台 2G 内存的轻量云服务器,上面跑了两个小博客。前阵子发现站点隔三差五就会蹦出 502 Bad Gateway 错误,有时候刷新两下又能打开,有时候直接彻底打不开。顺手把这次排查的过程以及目前跑得比较稳定的参数记下来,方便日后备忘,也给遇到同样情况的朋友一个参考。

1. 临时恢复与紧急处置

站点突然 502,通常代表 Nginx 还在正常工作,但负责处理动态请求的 PHP-FPM 挂了或者响应超时了。

如果手头有急事需要马上恢复访问,可以先别急着重启整台云服务器(重启耗时且容易导致 MySQL 异常关机出 bug),直接去宝塔后台处理:

  • 打开【软件商店】-> 找到当前运行的【PHP】-> 点击【设置】->【服务】-> 点击【重启】。
  • 也可以直接 SSH 连上服务器,执行平滑重启命令:/etc/init.d/php-fpm-xx restart(xx 对应你的 PHP 版本号)。

这只是临时救急,要彻底搞清楚为什么挂掉,必须去翻日志。

2. 查看日志确认具体原因

502 报错绝大部分逃不出两类原因:要么是子进程全被占满了,要么是内存爆掉被系统内核强制干掉了。我们可以重点看两处日志:

第一处是 PHP-FPM 慢日志与错误日志。在宝塔面板的 PHP 设置里,切换到【运行日志】。如果日志里经常出现类似下面这行记录:

WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

这说明并发请求数超过了设置的最大子进程上限,后来的请求只能排队等待,超时后 Nginx 就会返回 502。

第二处是 Linux 系统的 OOM(Out Of Memory)日志。很多轻量小机器内存小,并发一高容易直接把物理内存吃光,触发系统自我保护机制。在终端里敲这条命令:

dmesg -T | grep -i oom

如果能看到系统杀掉了 php-fpm 相关的进程,就说明是内存真的爆了,导致服务被强制关闭。

3. 关键参数设置参考

定位到问题后,调整主要集中在两块:虚拟内存(Swap)PHP-FPM 并发配置

小内存机器(尤其是 1G、2G 机器)极度建议在宝塔面板的【Linux 工具箱】里开一个 Swap。Swap 相当于是给物理内存买的“缓冲垫”,能有效避免进程因为瞬间内存不足被直接杀掉。

以下是我在实操中针对常见小规格机器总结的推荐配置参数:

机器物理内存建议 Swap 大小PHP 运行模式max_children(最大子进程数)start_serversmin_spare_serversmax_spare_servers
1 核 1G1024 MBondemand / dynamic5 - 8224
2 核 2G2048 MBdynamic10 - 203310
2 核 4G2048 MBdynamic30 - 505520

为什么这么设?

一般的 WordPress 或轻量站点,一个 PHP 7.4/8.0 子进程在处理请求时会占用 20MB 到 40MB 不等的内存。如果 2G 内存的机器你盲目把 max_children 设成 50,一旦碰到集中访问,50 个子进程能瞬间吃掉近 2GB 内存,直接导致 MySQL 或 PHP 自己被系统干掉。宁可让请求稍慢一点在队列里排队,也千万不要把子进程上限开得过大。

修改方法:在宝塔面板打开【PHP 设置】->【性能调整】,选对应的预设或者手动填入上述数值,保存后重载配置生效。

4. 为什么改完参数后还是会被打崩?

很多人改完参数后跑了一两天,发现偶尔还是会蹦 502。查看访问日志才发现,自己的小网站其实根本没有那么多真人访客,流量几乎全是被境外的扫描脚本、恶意注入测试以及不讲武德的内容农场爬虫打满的。

这类恶意请求通常集中扫 wp-login.phpxmlrpc.php 或者全站盲爬。每一次请求都要调动一次 PHP 进程,几秒钟内几十个恶意请求过来,刚调好的 max_children 就会被瞬间占满,正常用户自然就 502 了。

光靠改 PHP 参数防不住这种无脑扫描,小内存机器更不可能跟扫号脚本硬拼资源。最治本的做法是把脏流量直接拦在 Nginx 层,连进入 PHP 解释器的机会都不给它们。

宝塔自带的 Nginx 防火墙插件做这件事就非常合适,可以直接在最外层开启防 CC、屏蔽常见恶意扫描规则和海外垃圾爬虫,把它们在进门前就掐掉,服务器 CPU 和内存能立刻空出一大截。顺带说一句,如果打算长期用这个防火墙插件,宝塔官方的年费其实相对偏贵。我们站正好提供正版的终身授权方案(一次买断、永久有效,而且支持在后台免费自助换绑服务器 IP),平时经常折腾服务器、想省心长期跑项目的朋友可以去首页了解一下,算下来性价比高很多。

常见问题与解答 (FAQ)

Q 修改完 PHP 的性能参数后,需要重启 Nginx 吗?

不需要重启 Nginx,只需要在宝塔后台平滑重载或者重启对应的 PHP-FPM 服务即可生效。

Q 小内存机器开启 Swap 虚拟内存会不会拖慢系统性能?

Swap 主要是防止物理内存用尽时服务被系统直接杀死,充当兜底缓冲;只要不是物理内存长期严重不足导致频繁发生页面交换,对日常性能的影响微乎其微。

返回运维知识库