Nginx返回502 Bad Gateway的8种原因与解决方案
502 的本质:Nginx 能工作,但后端出问题了
502 Bad Gateway 的含义是:Nginx 成功接收了客户端请求,但在向后端(PHP-FPM、Node.js、Python 应用等)转发时出错。这说明 Nginx 本身在运行,问题出在后端服务上。
正因如此,排查 502 要重点关注 Nginx 的反向代理配置和后端应用的状态,而不是 Nginx 自身。
原因 1:PHP-FPM 未运行或崩溃
这是 WordPress / PHP 网站出现 502 最常见的原因。
# 检查 PHP-FPM 状态
sudo systemctl status php8.1-fpm
# 如果未运行,启动
sudo systemctl start php8.1-fpm
# 查看 PHP-FPM 错误日志
sudo tail -n 50 /var/log/php8.1-fpm.log如果 PHP-FPM 频繁崩溃,检查 pm.max_children 配置是否过低:
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
# 调整进程数(每个 PHP-FPM 进程约占 30–50MB 内存)
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10原因 2:Unix Socket 路径或权限错误
Nginx 通过 Unix Socket 与 PHP-FPM 通信,路径或权限不一致会导致 502:
# 查看 PHP-FPM 实际监听的 socket 路径
sudo grep "listen = " /etc/php/8.1/fpm/pool.d/www.conf
# 对应 Nginx 配置中的 fastcgi_pass 必须与上面一致
# 常见路径:/var/run/php/php8.1-fpm.sock
# 检查 socket 文件是否存在
ls -la /var/run/php/php8.1-fpm.sock确保 Nginx 配置中的路径与 PHP-FPM 配置完全一致:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
# 不要写错版本号,8.1 对应 8.1,不能混用
}原因 3:后端应用未启动(Node.js / Python)
# 检查后端应用是否在目标端口监听
sudo ss -tlnp | grep :3000 # Node.js 默认端口
sudo ss -tlnp | grep :8000 # Python 应用端口
# 检查服务状态
sudo systemctl status myapp
# 查看应用日志
sudo journalctl -u myapp -n 50 --no-pager原因 4:upstream 连接超时
后端应用响应太慢,超过 Nginx 等待时间导致 502:
sudo nano /etc/nginx/nginx.conf # 或站点配置文件location / {
proxy_pass http://127.0.0.1:3000;
# 增加超时时间(默认 60s,可适当调大)
proxy_connect_timeout 60s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
}原因 5:后端应用内存耗尽被 OOM Killer 杀死
# 查看 OOM Killer 日志,确认是否有进程被杀
sudo dmesg | grep -i "out of memory"
sudo journalctl -k | grep -i "oom"如果确认是 OOM 问题,需要优化应用内存使用或升级服务器内存配置。
原因 6:Nginx upstream 配置地址错误
# 检查 Nginx 配置中 proxy_pass 或 fastcgi_pass 的地址是否正确
sudo nginx -t
# 常见错误:端口写错、使用了已停用的 Unix Socket 路径
grep -r "proxy_pass\|fastcgi_pass" /etc/nginx/sites-enabled/原因 7:服务器磁盘满导致应用无法写入
df -h
# 如果根分区 100%,应用无法创建临时文件,PHP 报错导致 502
# 快速清理
sudo journalctl --vacuum-time=3d
sudo apt clean
sudo find /tmp -mtime +1 -delete原因 8:PHP max_execution_time 过短
PHP 脚本执行超过 max_execution_time 时被强制终止,Nginx 收到中断连接,返回 502:
sudo nano /etc/php/8.1/fpm/php.ini
# 适当增加执行时间(默认 30s)
max_execution_time = 120
sudo systemctl restart php8.1-fpm502 排查流程总结
| 排查步骤 | 命令 |
|---|---|
| 确认 Nginx 在运行 | systemctl status nginx |
| 查看 Nginx 错误日志 | tail -n 50 /var/log/nginx/error.log |
| 确认后端服务在运行 | systemctl status php-fpm / myapp |
| 确认端口/Socket 监听 | ss -tlnp |
| 检查磁盘是否满 | df -h |
| 检查内存是否耗尽 | free -h / dmesg | grep oom |
如需稳定的香港服务器运行 Nginx + PHP 业务,IDC.Net 香港云服务器首月 10 元起,SSD 硬盘,CN2 GIA 线路,7×24 工单支持,支付宝付款即可开通。