船说 CMS 出现 502 网关错误如何处理
照着这篇的顺序排查,你能在 10 分钟内定位船说 CMS 报 502 的真实原因并让站点恢复访问。
船说 CMS 是基于 PHP + MySQL 的内容管理系统,跑在 Nginx + PHP-FPM 上,所以它报 502 基本不是 CMS 自己的 bug,而是 Nginx 拿不到 PHP 的有效响应。下面按"先定位、再恢复、最后治根"的顺序走。
第一步:先确认 502 是谁返回的
这一步要判断错误出在源站还是 CDN,避免在白忙活的机器上查半天。打开浏览器按 F12 → Network → 刷新页面 → 点第一个主文档请求 → 看 Response Headers 里的 server 字段。如果写的是 nginx,说明源站直接挂了;如果是 cloudflare、EdgeOne 之类,说明是 CDN 回源失败。
命令行更快:curl -I https://你的域名。
注意:如果 CDN 已经缓存了 502 页面,你在源站修好了前台还是 502。去 CDN 控制台 → 缓存刷新 → URL 刷新,把首页地址刷一遍。
第二步:看 Nginx 错误日志,拿到那行关键报错
这一步的目的是把"502"翻译成一句具体的话。宝塔面板默认路径是 /www/wwwlogs/你的域名.error.log,原生安装是 /var/log/nginx/error.log:
tail -n 50 /www/wwwlogs/你的域名.error.log
对照三种最常见的输出:
connect() to unix:/tmp/php-cgi-74.sock failed (11: Resource temporarily unavailable)→ PHP-FPM 进程被占满。upstream timed out (110: Connection timed out)→ 某个 PHP 脚本卡死了。no live upstreams→ PHP-FPM 已经死了。
注意:宝塔的「网站 → 设置 → 日志」默认只显示访问日志,错误日志在「网站 → 设置 → 配置文件」页面右侧的「错误日志」标签里,别找错地方。
第三步:检查 PHP-FPM 是否活着、进程数够不够
这一步确认 PHP-FPM 进程状态并调整并发上限。先看状态:
systemctl status php-fpm-74
ps aux | grep php-fpm | wc -l
再调进程数。宝塔面板 8.x 的路径是:软件商店 → 已安装 → PHP 7.4 → 设置 → 性能调整 → max_children。如果这里是 5 或 10,而船说 CMS 正在跑采集、批量生成静态页,很容易瞬间打满,直接 502。
按内存给值:每个 php-fpm 进程约占 40–80MB,2G 内存开到 20–30,4G 开到 40–50。改完点「保存」,宝塔会自动重载。
注意:保存后如果 502 变成 504 或整站白屏,说明开太大把内存吃满了,用
free -h看剩余内存,往下调一档。
第四步:重启服务先恢复访问
这一步用最快的手段把站点拉起来,给自己争取排查时间:
systemctl restart php-fpm-74
systemctl reload nginx
宝塔面板对应:软件商店 → 已安装 → PHP 7.4 → 重启;Nginx → 重载配置。注意 Nginx 用「重载配置」而不是「重启」,重载不会中断已有连接。
注意:只重启不排查,采集任务一跑起来还会再挂。重启完立刻做第五步。
第五步:查船说 CMS 自身有没有卡死的任务
这一步找出把 PHP 拖死的那个具体动作。先看 PHP 慢日志,宝塔路径是「PHP 7.4 → 设置 → 慢日志」,文件在 /www/server/php/74/var/log/slow.log,找执行超过 5 秒的记录。
再看船说 CMS 后台:左侧菜单「采集管理 → 采集任务」,把正在运行的任务点「停止」;「系统 → 定时任务」里把自动采集、自动生成缓存的计划任务临时关掉。
如果是数据库拖的,进 phpMyAdmin 或命令行执行:
show full processlist;
看到船说 CMS 数据表(前缀通常是 cs_)上长时间 Query 状态的线程,记下 Id 后 kill Id;。
第六步:核对 Nginx 与 PHP-FPM 的监听地址是否一致
这一步排除配置文件写错。打开宝塔「网站 → 设置 → 配置文件」,找到 location ~ \.php$,看 fastcgi_pass 的值,例如 unix:/tmp/php-cgi-74.sock。再去「PHP 7.4 → 配置修改」看 FPM 监听地址,两边必须完全一致——PHP 从 7.4 升到 8.0 后 socket 名会变成 php-cgi-80.sock,这里不跟着改就是稳定 502。
改完先测语法再生效:
nginx -t
systemctl reload nginx
必须看到 syntax is ok 和 test is successful 才能 reload。
第七步:三个容易被忽略的开关
- 磁盘写满:
df -h,如果/或/www使用率 100%,PHP 写不了 session 和缓存,表现就是 502。清日志:rm -f /www/wwwlogs/*.log。 - 内存 OOM:
dmesg | grep -i oom,如果看到killed process php-fpm,就是内存不足,回到第三步调小max_children或加内存。 - 伪静态规则贴错:船说 CMS 的伪静态规则要贴到「网站 → 设置 → 伪静态」里,贴到别处会导致 index.php 反复跳转。
小结
- 502 是 Nginx 拿不到 PHP 响应,先看 Nginx 错误日志那一行,再决定查进程还是查脚本。
Resource temporarily unavailable就调max_children,upstream timed out就查慢日志和采集任务。- 重启 PHP-FPM 能救急,但采集任务和定时任务不停,还会复发。
- PHP 版本升级后务必核对 Nginx 里的 socket 名称是否同步。
- CDN 场景记得刷新缓存,否则源站修好了你看到的还是 502。
原文链接:https://www.gj0.com/thread-811.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。