欢迎光临
我们一直在努力

Nginx 出现 502 Bad Gateway 怎么办?常见原因与排查教程

1. 502 Bad Gateway 是什么意思?

当浏览器访问网站时,如果看到:

502 Bad Gateway

通常说明:

Nginx 本身已经收到请求,但它无法从后端服务获得正常响应。

也就是说,问题往往不在 Nginx 是否能启动,而是在 Nginx 后面的上游服务。

常见场景包括:

PHP-FPM 没有启动;

PHP-FPM Socket 路径不一致;

反向代理的后端程序没有运行;

Docker 容器异常退出;

上游端口没有监听;

后端程序主动关闭连接;

Nginx 无法访问上游 Socket;

后端服务器响应异常。

因此排查 502 时,建议先确认:

Nginx → 后端服务

这条链路到底在哪一层出现问题。

2. 先检查 Nginx 是否正常运行

首先执行:

systemctl status nginx --no-pager

正常情况下应该看到:

Active: active (running)

如果 Nginx 本身没有运行,可以继续检查配置。

执行:

nginx -t

正常情况下会看到类似:

syntax is ok
test is successful

如果这里直接报错,就应该先修复 Nginx 配置问题。

不要在 nginx -t 仍然报错的情况下反复重启 Nginx。

3. 第一时间查看 Nginx 错误日志

Nginx 502检查服务状态和错误日志

502 问题最重要的排查入口之一就是 Nginx Error Log。

常见位置:

/var/log/nginx/error.log

查看最近日志:

tail -n 100 /var/log/nginx/error.log

实时查看:

tail -f /var/log/nginx/error.log

然后刷新一次出现 502 的网页。

重点观察刚刚产生的错误。

例如:

connect() failed (111: Connection refused) while connecting to upstream

通常说明 Nginx 尝试连接后端时,目标端口没有正常接受连接。

如果看到:

No such file or directory

则可能是 PHP-FPM Socket 或其他 Unix Socket 路径不存在。

如果看到:

Permission denied

则应该继续检查 Socket 或目录权限。

4. PHP 网站出现 502 先检查 PHP-FPM

WordPress、ThinkPHP、Laravel 等 PHP 网站出现 502 时,PHP-FPM 是重点排查对象。

首先确认当前服务器运行的 PHP-FPM 服务。

例如:

systemctl list-units --type=service | grep php

如果使用 PHP 8.2,可能看到:

php8.2-fpm.service

检查状态:

systemctl status php8.2-fpm --no-pager

如果状态为:

Active: failed

或者:

inactive

说明 PHP-FPM 当前没有正常运行。

可以继续查看日志:

journalctl -u php8.2-fpm -n 100 --no-pager

找到 PHP-FPM 无法启动的具体原因。

5. 检查 PHP-FPM Socket 路径是否一致

Nginx 502检查PHP-FPM和Socket配置

这是 Nginx 502 中很常见的问题。

例如 PHP-FPM 实际监听:

/run/php/php8.2-fpm.sock

但 Nginx 配置中却写成:

/run/php/php8.1-fpm.sock

那么 Nginx 无法找到正确的 PHP-FPM Socket,就会出现 502。

可以检查 PHP-FPM:

grep -R "^listen" /etc/php/*/fpm/pool.d/ 2>/dev/null

例如:

listen = /run/php/php8.2-fpm.sock

再检查 Nginx:

grep -R "fastcgi_pass" /etc/nginx/ 2>/dev/null

例如:

fastcgi_pass unix:/run/php/php8.1-fpm.sock;

如果两边路径不一致,就需要修改 Nginx 配置,使其指向当前真实存在的 PHP-FPM Socket。

修改后先执行:

nginx -t

确认无误后再重新加载:

systemctl reload nginx

6. PHP-FPM 使用端口时怎么检查?

有些环境不使用 Unix Socket,而是监听:

127.0.0.1:9000

可以执行:

ss -lntp | grep 9000

如果没有任何输出,说明当前没有程序监听 9000 端口。

再检查 Nginx:

fastcgi_pass 127.0.0.1:9000;

如果 Nginx 指向 9000,但 PHP-FPM 实际没有监听这个端口,也会出现 502。

所以必须保证:

Nginx 配置的地址和 PHP-FPM 实际监听地址一致。

7. 反向代理网站出现 502 怎么排查?

Nginx 502检查反向代理上游和Docker服务

如果 Nginx 不是运行 PHP,而是反向代理到:

Node.js;

Java;

Python;

Docker 应用;

其他 Web 服务,

例如 Nginx 配置:

location / {
    proxy_pass http://127.0.0.1:3000;
}

那么需要先直接测试后端。

执行:

curl -I http://127.0.0.1:3000

如果提示:

Failed to connect

或者:

Connection refused

说明问题不在 Nginx 本身,而是:

3000 端口对应的后端程序没有正常运行。

继续检查:

ss -lntp | grep 3000

如果仍然没有输出,就需要排查真正的后端应用。

8. 后端程序正常但 Nginx 仍然 502

如果执行:

curl -I http://127.0.0.1:3000

可以正常返回:

HTTP/1.1 200 OK

但通过 Nginx 访问还是 502,则继续检查:

proxy_pass 地址;

协议是否正确;

域名解析;

Unix Socket 权限;

Nginx 错误日志;

上游 HTTPS 配置;

后端是否根据 Host Header 限制访问。

例如实际后端使用:

https://127.0.0.1:3000

但 Nginx 写成:

proxy_pass http://127.0.0.1:3000;

也可能出现异常。

需要根据后端实际协议配置。

9. Docker 应用出现 502 怎么办?

如果 Nginx 后端运行在 Docker 中,可以先执行:

docker ps -a

重点查看对应容器状态。

如果看到:

Exited

或者:

Restarting

说明容器本身就没有正常提供服务。

继续查看:

docker logs --tail 100 容器名称

如果项目使用 Docker Compose:

docker compose ps

再查看:

docker compose logs --tail 100

只有确认容器已经正常运行以后,才继续排查 Nginx 到容器的网络连接。

10. Docker 端口映射是否正确?

例如应用容器内部监听:

3000

Docker 映射:

0.0.0.0:3000->3000/tcp

Nginx 可以通过:

127.0.0.1:3000

访问。

执行:

docker ps

确认是否存在类似:

0.0.0.0:3000->3000/tcp

如果只看到:

3000/tcp

可能表示该端口没有映射到宿主机。

这种情况下 Nginx 如果运行在宿主机,就不能直接通过:

127.0.0.1:3000

访问这个容器。

需要根据当前 Docker 网络结构进行配置。

11. Nginx 和 Docker 都在容器里怎么办?

如果 Nginx 和后端应用都运行在同一个 Docker Compose 项目中,通常更适合通过服务名访问。

例如:

services:
  nginx:
    image: nginx:alpine

  app:
    image: example/app

Nginx 配置可以根据实际网络使用:

proxy_pass http://app:3000;

而不是:

proxy_pass http://127.0.0.1:3000;

因为在 Nginx 容器内部:

127.0.0.1

代表 Nginx 容器自己。

它并不代表另一个 app 容器。

这是 Docker 反向代理环境中非常容易出现的配置错误。

12. 检查 Unix Socket 权限

如果 Nginx 错误日志中看到:

Permission denied

同时后端使用 Unix Socket,例如:

/run/php/php8.2-fpm.sock

可以查看:

ls -l /run/php/php8.2-fpm.sock

再确认:

Nginx 运行用户;

PHP-FPM Pool 用户;

Socket 所有者;

Socket 权限。

不要为了临时解决权限问题直接执行:

chmod 777

作为长期方案。

应该根据当前 Nginx 和 PHP-FPM 运行用户正确设置 Socket 权限。

13. 检查 Nginx 配置是否加载了旧版本 PHP

服务器升级 PHP 后特别容易出现这种情况。

例如网站原来使用:

PHP 8.1

后来升级成:

PHP 8.2

但 Nginx 网站配置仍然指向:

php8.1-fpm.sock

执行:

nginx -T 2>&1 | grep fastcgi_pass

可以查看 Nginx 当前实际加载的 FastCGI 配置。

然后和:

grep -R "^listen" /etc/php/*/fpm/pool.d/ 2>/dev/null

进行对比。

不要只检查某个配置文件,而忽略 Nginx 实际加载的其他 include 文件。

14. 检查服务器内存是否不足

如果后端程序经常被系统杀掉,Nginx 也可能间歇性出现 502。

查看内存:

free -h

检查 OOM:

dmesg -T | grep -Ei 'out of memory|oom|killed process'

如果看到:

Out of memory: Killed process

说明服务器曾经因为内存不足终止某个进程。

如果被终止的正好是:

PHP-FPM;

Node.js;

Java;

Docker 容器,

那么 Nginx 就可能因为找不到上游而出现 502。

15. 检查磁盘是否已满

磁盘空间完全耗尽以后,也可能造成后端服务异常。

执行:

df -h

再检查 inode:

df -i

如果关键分区已经接近:

100%

PHP Session;

数据库;

日志;

临时文件;

应用缓存

都可能无法正常写入。

此时应该先处理磁盘问题。

16. 检查后端应用日志

Nginx Error Log 只能告诉你:

Nginx 连接后端时发生了什么。

真正的应用错误还需要查看后端自身日志。

例如 PHP-FPM:

journalctl -u php8.2-fpm -n 100 --no-pager

Docker:

docker logs --tail 100 容器名称

Node.js、Java、Python 等应用也应该检查各自的程序日志。

比较常见的问题包括:

数据库连接失败;

环境变量缺失;

配置文件错误;

程序异常退出;

内存不足;

端口被占用。

17. 502 和 504 有什么区别?

这两个错误容易混淆。

502 Bad Gateway

通常表示 Nginx 从上游收到无效响应,或者根本无法正常连接上游。

504 Gateway Timeout

通常更偏向:

Nginx 已经尝试等待上游响应,但在规定时间内没有得到结果。

例如后端接口执行非常慢;

数据库查询卡住;

上游服务响应超时。

如果是 504,排查重点通常还要关注:

后端性能;

数据库查询;

接口响应时间;

代理超时时间。

不要遇到所有网关错误都直接增加 Nginx timeout。

18. 是否应该直接增加 proxy_read_timeout?

如果后端只是因为处理任务确实需要较长时间,可以根据业务适当调整:

proxy_read_timeout 60s;

但如果真实原因是:

后端程序已经挂掉;

数据库无法连接;

容器不断重启;

端口根本没有监听,

增加 timeout 没有实际意义。

应该先确认上游服务能够正常工作,再考虑是否需要调整超时时间。

19. Nginx 502 快速排查顺序

建议按照以下顺序排查:

第一步:检查 Nginx

nginx -t
systemctl status nginx --no-pager

第二步:看错误日志

tail -n 100 /var/log/nginx/error.log

第三步:如果是 PHP 网站

检查 PHP-FPM:

systemctl status php8.2-fpm --no-pager

确认 Socket:

grep -R "^listen" /etc/php/*/fpm/pool.d/ 2>/dev/null

第四步:如果是反向代理

直接测试上游:

curl -I http://127.0.0.1:上游端口

第五步:如果使用 Docker

docker ps -a
docker logs --tail 100 容器名称

第六步:检查系统资源

free -h
df -h

这样通常能够比较快定位:

Nginx;

PHP-FPM;

上游应用;

Docker;

资源不足

到底是哪一层出现问题。

20. 不建议遇到 502 就重装 Nginx

502 大多数时候并不代表 Nginx 安装损坏。

如果 Nginx 本身能够正常显示:

502 Bad Gateway

反而说明 Nginx 很可能仍然在运行。

真正需要重点排查的是:

Nginx 后面的上游服务。

所以不要一看到 502 就直接:

卸载 Nginx;

重装服务器;

删除网站配置。

应该先查看:

tail -n 100 /var/log/nginx/error.log

再根据具体错误处理。

21. 搭建网站时的服务器建议

如果服务器同时运行:

Nginx;

PHP-FPM;

MySQL;

Redis;

Docker;

多个网站,

那么 CPU、内存和磁盘空间都可能影响后端服务稳定性。

如果需要部署 WordPress、Docker Web 应用、反向代理等业务,可以根据实际访问量和服务数量选择莱卡云 Linux 云服务器。

查看官网购买链接: https://www.lcayun.com

如果服务器还没有安装 Docker,可以参考:

安装教程: 服务器上安装docker和docker-compose教程

如果 Nginx 后端使用 Docker Compose,也可以参考:

相关阅读: 使用 Docker 搭建 Dockge:可视化管理 Docker Compose 项目

如果遇到的不是 502,而是端口从公网无法连接,可以参考:

相关阅读: 云服务器端口不通怎么办?Connection refused 与 timed out 排查教程

22. 总结

Nginx 出现:

502 Bad Gateway

通常意味着:

Nginx 能接收到请求,但后端服务没有正常返回结果。

首先执行:

nginx -t

确认 Nginx 配置。

然后查看:

tail -n 100 /var/log/nginx/error.log

错误日志通常会直接给出重要线索。

如果是 PHP 网站,重点检查:

PHP-FPM;

Socket;

FastCGI 配置。

如果是反向代理网站,直接测试:

curl -I http://127.0.0.1:上游端口

如果后端运行在 Docker 中,则继续检查:

容器状态;

容器日志;

端口映射;

Docker Network。

最后再结合:

内存;

磁盘;

OOM;

应用日志

判断后端为什么没有正常工作。

正确的排查顺序应该是:

Nginx → 错误日志 → PHP-FPM / 上游服务 → Docker → 系统资源

而不是一出现 502 就重新安装 Nginx。

赞(0)
未经允许不得转载:莱卡云 » Nginx 出现 502 Bad Gateway 怎么办?常见原因与排查教程