最近在维护一台 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_servers | min_spare_servers | max_spare_servers |
|---|---|---|---|---|---|---|
| 1 核 1G | 1024 MB | ondemand / dynamic | 5 - 8 | 2 | 2 | 4 |
| 2 核 2G | 2048 MB | dynamic | 10 - 20 | 3 | 3 | 10 |
| 2 核 4G | 2048 MB | dynamic | 30 - 50 | 5 | 5 | 20 |
为什么这么设?
一般的 WordPress 或轻量站点,一个 PHP 7.4/8.0 子进程在处理请求时会占用 20MB 到 40MB 不等的内存。如果 2G 内存的机器你盲目把 max_children 设成 50,一旦碰到集中访问,50 个子进程能瞬间吃掉近 2GB 内存,直接导致 MySQL 或 PHP 自己被系统干掉。宁可让请求稍慢一点在队列里排队,也千万不要把子进程上限开得过大。
修改方法:在宝塔面板打开【PHP 设置】->【性能调整】,选对应的预设或者手动填入上述数值,保存后重载配置生效。
4. 为什么改完参数后还是会被打崩?
很多人改完参数后跑了一两天,发现偶尔还是会蹦 502。查看访问日志才发现,自己的小网站其实根本没有那么多真人访客,流量几乎全是被境外的扫描脚本、恶意注入测试以及不讲武德的内容农场爬虫打满的。
这类恶意请求通常集中扫 wp-login.php、xmlrpc.php 或者全站盲爬。每一次请求都要调动一次 PHP 进程,几秒钟内几十个恶意请求过来,刚调好的 max_children 就会被瞬间占满,正常用户自然就 502 了。
光靠改 PHP 参数防不住这种无脑扫描,小内存机器更不可能跟扫号脚本硬拼资源。最治本的做法是把脏流量直接拦在 Nginx 层,连进入 PHP 解释器的机会都不给它们。
宝塔自带的 Nginx 防火墙插件做这件事就非常合适,可以直接在最外层开启防 CC、屏蔽常见恶意扫描规则和海外垃圾爬虫,把它们在进门前就掐掉,服务器 CPU 和内存能立刻空出一大截。顺带说一句,如果打算长期用这个防火墙插件,宝塔官方的年费其实相对偏贵。我们站正好提供正版的终身授权方案(一次买断、永久有效,而且支持在后台免费自助换绑服务器 IP),平时经常折腾服务器、想省心长期跑项目的朋友可以去首页了解一下,算下来性价比高很多。