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
 
常见报错:
  1. 内存不足 oom‑kill:服务器内存太低,php‑fpm 被系统杀掉。阿里云 1 核 1G 机器跑 WP 很容易出现。
  2. 权限错误:socket 文件无法访问
  3. 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.conf
ini
 
 
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。
  1. 临时关闭全部插件:服务器重命名 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
 

快速排查顺序总结(照着做)

  1. systemctl restart php81‑fpm 测试是否立刻恢复
  2. systemctl status php81‑fpm看是否启动失败
  3. dmesg -T |grep oom 判断是不是内存杀进程
  4. nginx 配置 fastcgi_pass 和 php‑fpm pool 监听必须一致
  5. 看 php‑fpm 日志找报错
  6. 关闭 wp 插件,排除插件崩溃
  7. 设置 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
 
现象:
  1. 重启 php‑fpm,网站立刻恢复正常;
  2. 过几分钟 / 访问几次,又 502;
  3. dmesg -T |grep -i oom 可以看到日志 Out‑of‑memory: Killed process php‑fpm
⚠️ 仅仅物理内存打满,如果 Swap 充足,不会 OOM,只是变慢;真正直接 502 崩溃,是物理内存 + Swap 同时耗尽。

3、PHP‑FPM 对内存的影响重点(WordPress 最大坑)

php‑fpm 每一个 worker 子进程都会占用内存,默认配置非常激进。
 
举例 1G 服务器默认配置:
 
pm.max_children = 20
 
每个 php 进程占用 30‑80MB,20 个进程直接吃掉 600M‑1600M 内存,直接打爆。

推荐配置参考 pool.d/www.conf

表格
 
服务器内存pm.max_childrenpm.start_serverspm.min_spare_serverspm.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、简单总结成一句话判断规则

  1. 看 available,不是 used;
  2. available 长期低于总内存 20%,属于警戒,要优化;
  3. available 持续低于 10%,随时会 OOM 导致 502;
  4. 重启 php‑fpm 短暂好,一会又 502,几乎都是内存 OOM;
  5. 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
 
  1. 物理总内存≈8G 服务器,available = 2.3Gi
     
    ✅ 当前可用内存 2.3G,物理层面现在并不紧张。
available>1.2G 属于安全区间,单纯物理内存不会直接把 php‑fpm 打死。
  1. ⚠️致命问题: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 processphp‑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.conf
ini
 
 
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 记录)

  1. 查看 php‑fpm 服务状态
bash
 
运行
 
 
systemctl status php8x-fpm
 
看是否启动失败、直接崩溃退出
 
2. 看 nginx 错误日志
bash
 
运行
 
 
tail -40 /var/log/nginx/error.log
 
重点看报错:是 socket 连接拒绝?还是 PHP 程序报错。

简单总结

  1. 当前时刻内存状态健康,还有 2.3G 可用,不是现在内存不够;
  2. 但是没有 Swap!突发流量峰值没有兜底,极易瞬间 OOM 出现 502,必须加上 Swap;
  3. 执行dmesg -T | grep -i oom,就能直接判断你之前 502 是不是内存杀进程造成。
把 dmesg 输出发给我,就能精准定位根源。
 
最后通过查看nginx的错误日志,发现其实是数据库出了问题。
posted @ 2026-07-28 21:22  夏威夷8080  阅读(20)  评论(0)    收藏  举报