Nginx返回502 Bad Gateway的8种原因与解决方案

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-fpm

502 排查流程总结

排查步骤命令
确认 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 工单支持,支付宝付款即可开通。

Telegram