wordpress+nginx站点提示502 Bad Gateway问题排查
wordpress + 阿里云 linux 服务器 + php+nginx 站点,之前一直正常,今天访问域名提示 502 Bad Gateway
WordPress Nginx 502 Bad Gateway(阿里云 Linux)
502 本质:Nginx 无法连接 PHP‑FPM 服务,PHP‑FPM 挂掉、崩溃、端口 / 套接字权限不对、内存打满、php‑fpm 没启动是最常见原因。
环境:阿里云 ECS、Nginx + php‑fpm + WordPress
第一步:快速确认是不是 php‑fpm 挂了
登录服务器 ssh
bash
运行
# 查看php‑fpm进程,把php81换成你的版本,比如php74、php80
ps aux | grep php-fpm
- 如果没有 php‑fpm 进程 → php‑fpm 崩溃未启动
- 有进程,继续往下排查
重启 php‑fpm(优先试,大部分 502 直接恢复)
bash
运行
# php81示例,看你实际版本 systemctl list-unit-files |grep php
systemctl restart php81-fpm
systemctl status php81-fpm
我的版本是
systemctl restart php-fpm
systemctl status php-fpm
status看输出:- active (running):正常
- failed:启动失败,看报错日志
第二步:看日志,定位真实原因(最重要)
1)PHP‑FPM 日志
bash
运行
# 示例php8.1,换成你的版本
tail -n50 /var/log/php8.1-fpm.log
常见报错:
- 内存不足 oom‑kill:服务器内存太低,php‑fpm 被系统杀掉。阿里云 1 核 1G 机器跑 WP 很容易出现。
- 权限错误:socket 文件无法访问
- php 程序致命错误,导致 worker 全部崩溃
2)Nginx 错误日志
bash
运行
tail -n50 /var/log/nginx/error.log
典型 502 日志:
plaintext
connect() to unix:/run/php/php8.1‑fpm.sock failed (111: Connection refused)
含义:nginx 想去连 php‑fpm,但是 php‑fpm 没监听这个 socket。
第三步:两种通信方式:unix socket vs tcp 端口
打开你的站点 nginx 配置,一般在
/etc/nginx/sites‑available/xxx.conf情况 A:使用 socket(最常用)
nginx 配置里:
fastcgi_pass unix:/run/php/php8.1-fpm.sock;检查 php‑fpm 配置文件
/etc/php/8.1/fpm/pool.d/www.confini
listen = /run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
nginx 运行用户必须和上面 owner/group 一致查看 nginx 用户:ps aux |grep nginx,看 nginx 进程用户,一般是www-data或者nginx
如果 pool 配置是listen =127.0.0.1:9000,那 nginx 就要写fastcgi_pass 127.0.0.1:9000;两边必须完全对应,一个 socket 一个端口直接 502
修改配置后重载 php‑fpm
bash
运行
systemctl restart php8.1-fpm
systemctl reload nginx
第四步:高频元凶:内存不足(阿里云小服务器最高发)
看系统日志是否 OOM 杀死 php
bash
运行
dmesg -T | grep -i oom
看到
Out‑of‑memory: Killed process xxx php‑fpm 代表内存耗尽,系统直接干掉 PHP 进程 → 访问就 502。临时方案:调小 php‑fpm 进程数
编辑 pool.d/www.conf
plaintext
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers =5
1G 内存建议 max_children=5~8,不要默认几十,瞬间占满内存。
永久方案:加 swap 交换分区,小机器必备
bash
运行
# 创建1G swap示例
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
第五步:wordpress 自身 PHP 致命错误导致 php‑fpm 崩溃
升级插件、主题后,访问网站就 502,刷新又好一会,大概率插件代码致命错误打崩 php worker。
- 临时关闭全部插件:服务器重命名 wp‑content/plugins 为 plugins.bak,访问网站看是否恢复。
bash
运行
mv /var/www/你的网站/wp-content/plugins /var/www/你的网站/wp-content/plugins.bak
mkdir /var/www/你的网站/wp-content/plugins
访问网站,如果正常,说明某个插件导致 PHP 致命错误。再逐个恢复插件定位坏插件。
第六步:文件权限问题
wordpress 网站目录,推荐 www-data 用户拥有
bash
运行
#替换为你的网站根目录
chown -R www-data:www-data /var/www/your-site
chmod -R 755 /var/www/your-site
chmod -R 775 /var/www/your-site/wp-content
快速排查顺序总结(照着做)
systemctl restart php81‑fpm测试是否立刻恢复systemctl status php81‑fpm看是否启动失败dmesg -T |grep oom判断是不是内存杀进程- nginx 配置 fastcgi_pass 和 php‑fpm pool 监听必须一致
- 看 php‑fpm 日志找报错
- 关闭 wp 插件,排除插件崩溃
- 设置 swap、调小 php‑fpm 子进程数
如果重启 php‑fpm 后网站短暂正常,过一会又报 502,90% 是内存不足。
把下面两条命令输出发给我,可以快速帮你定位问题:
bash
运行
systemctl status php8.1-fpm
dmesg -T | grep -i oom
把版本换成你自己的 PHP 版本。
如果你愿意,可以贴 nginx 站点配置、php‑fpm www.conf 关键片段,我帮你直接看配置错误。
阿里云服务器内存使用达到多少会有影响?
阿里云 Linux 内存阈值说明(Nginx+PHP‑FPM+WordPress 场景)
先说核心:不是到 100% 立刻宕机,要看剩余可用内存、Swap、OOM 杀手,Linux 系统会大量用 buff/cache,这部分不算占用,很多人被 free 命令误导。
1、先搞懂 free -h 的指标含义
执行
bash
运行
free -h
total:总物理内存used:已经占用free:完全空闲内存- available(最重要!):系统可立即分配给程序的内存,包含可回收缓存
✅ 判断标准看 available,不要看 used。buff/cache 是 Linux 文件缓存,属于正常,不是泄露。
不同机器的经验阈值(跑 WP 网站,Nginx+PHP‑FPM)
① 1G 内存(1 核 1G,WP 最低配,非常吃紧)
- available >300M:安全,正常运行
- available 150‑300M:警戒,访问一多就容易卡顿
- available <150M:高危,随时触发 OOM,php‑fpm 被系统杀掉 → 直接 502 Bad Gateway
1G 机器强烈建议必须开启 1G Swap,否则稍微来几个并发直接崩 502。
② 2G 内存(2 核 2G,WP 比较舒服)
- available >600M:安全
- available 300‑600M:警戒
- available <300M:高危,容易 OOM
③ 4G 内存
- available >1.2G:安全
- available 500M‑1.2G:警戒
- available <500M:高危
超过阈值不一定马上报错,来了流量、爬虫、WP 后台保存页面,瞬间暴涨内存,直接 OOM 杀 php‑fpm,表现就是502。
2、什么是 OOM Killer(你遇到 502 最常见元凶)
当物理内存 + Swap 全部耗尽,系统内核为保证服务器不整体卡死,会主动把最吃内存进程杀掉,绝大多数时候被杀的就是
现象:
php‑fpm。
- 重启 php‑fpm,网站立刻恢复正常;
- 过几分钟 / 访问几次,又 502;
dmesg -T |grep -i oom可以看到日志Out‑of‑memory: Killed process php‑fpm
⚠️ 仅仅物理内存打满,如果 Swap 充足,不会 OOM,只是变慢;真正直接 502 崩溃,是物理内存 + Swap 同时耗尽。
3、PHP‑FPM 对内存的影响重点(WordPress 最大坑)
php‑fpm 每一个 worker 子进程都会占用内存,默认配置非常激进。
举例 1G 服务器默认配置:
每个 php 进程占用 30‑80MB,20 个进程直接吃掉 600M‑1600M 内存,直接打爆。
pm.max_children = 20
推荐配置参考 pool.d/www.conf
表格
| 服务器内存 | pm.max_children | pm.start_servers | pm.min_spare_servers | pm.max_spare_servers |
|---|---|---|---|---|
| 1G | 5 | 2 | 1 | 3 |
| 2G | 10 | 3 | 2 | 6 |
| 4G | 20 | 4 | 2 | 10 |
WordPress 插件越多,单个 php 进程内存占用越高,插件多建议再降一档。
4、Swap 交换分区作用(阿里云小机器必开)
Swap 不是性能方案,是保命兜底。
- 没有 Swap:内存不足直接杀进程,网站 502
- 有 Swap:内存不够,把冷数据放到磁盘,网站变慢,但不会直接 502 崩溃
不建议 Swap 设置太大,1‑2G 足够,不要 4G 以上。
5、日常监控命令,快速看内存压力
bash
运行
#看内存
free -h
#实时看进程内存,按M排序
top
#或者htop
#查看是否发生过OOM
dmesg -T | grep -i oom
#看php‑fpm每个进程占用内存
ps aux |grep php-fpm |sort -k4 -n
6、简单总结成一句话判断规则
- 看 available,不是 used;
- available 长期低于总内存 20%,属于警戒,要优化;
- available 持续低于 10%,随时会 OOM 导致 502;
- 重启 php‑fpm 短暂好,一会又 502,几乎都是内存 OOM;
- 1G 实例,必须开启 Swap + 降低 php‑fpm 进程数。
如果你把
free -h 的输出贴给我,我直接告诉你现在你的服务器内存压力属于什么等级,以及给你一套直接复制粘贴的 php‑fpm 配置。
我的是这样的,你分析分析
内存数据分析
plaintext
Mem: total 7.6Gi, used 4.9Gi, free 154Mi, buff/cache 2.5Gi, available 2.3Gi
Swap: 0B
- 物理总内存≈8G 服务器,
available = 2.3Gi✅ 当前可用内存 2.3G,物理层面现在并不紧张。
available>1.2G 属于安全区间,单纯物理内存不会直接把 php‑fpm 打死。
- ⚠️致命问题:Swap = 0,完全没有交换分区!
虽然现在还有 2.3G 可用,但有一个巨大风险:瞬间流量、爬虫、WordPress 后台操作、PHP 突发内存暴涨,物理内存直接瞬间打满,没有 Swap 兜底,内核直接 OOM‑kill 杀掉 php‑fpm 进程,立刻出现 502 Bad Gateway。8G 机器一样会 OOM,不要以为内存大就不需要 Swap。
对你现状判断
- 你这次 502,不一定是现在内存就耗尽,但缺少 Swap 是重大隐患。
- available=2.3G 代表此时此刻余量充足;但是峰值瞬间内存冲上去,没有 Swap 缓冲,直接杀进程。
现象就是:重启 php‑fpm 立刻好,访问一会又 502。
第一步:确认是否已经发生 OOM(关键)
执行这条命令
bash
运行
dmesg -T | grep -i oom
- 如果输出带有
Killed process、php‑fpm,就代表历史确实是内存 OOM 导致 502; - 如果没有任何输出,说明本次 502不是 OOM,回到 Nginx/php‑fpm 套接字、PHP 代码报错方向排查。
第二步:给 8G 机器设置 2G Swap(强烈建议执行,复制粘贴)
bash
运行
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
执行完,再敲
free -h,你就能看到 Swap 变成 2G。机器重启 Swap 也自动生效。第三步:PHP‑FPM 配置优化(8G 机器 WordPress 推荐值)
打开
pool.d/www.confini
pm.max_children = 30
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 12
如果你 WordPress 插件很多,内存占用高,可以降到pm.max_children =20更稳妥。修改完成重启 php‑fpm
bash
运行
systemctl restart php8x-fpm
第四步:排查 502 真正原因(如果 dmesg 没有 OOM 记录)
- 查看 php‑fpm 服务状态
bash
运行
systemctl status php8x-fpm
看是否启动失败、直接崩溃退出
2. 看 nginx 错误日志
bash
运行
tail -40 /var/log/nginx/error.log
重点看报错:是 socket 连接拒绝?还是 PHP 程序报错。
简单总结
- 当前时刻内存状态健康,还有 2.3G 可用,不是现在内存不够;
- 但是没有 Swap!突发流量峰值没有兜底,极易瞬间 OOM 出现 502,必须加上 Swap;
- 执行
dmesg -T | grep -i oom,就能直接判断你之前 502 是不是内存杀进程造成。
把 dmesg 输出发给我,就能精准定位根源。
最后通过查看nginx的错误日志,发现其实是数据库出了问题。
浙公网安备 33010602011771号