Nginx 出现 502 和 504 怎么区分?从错误日志开始排查
网站无法访问时,Nginx 经常会返回502 Bad Gateway或504 Gateway Time-out。这两个错误页面看起来很像,但背后的原因并不完全相同。
简单理解:
- 502:Nginx 联系上游服务时,连接失败或收到了无效响应;
- 504:Nginx已经把请求交给上游服务,但等待太久仍未拿到响应。
下面记录一套我平时使用的排查顺序。
一、先确认真实的 HTTP 状态码
不要只根据浏览器页面上的文字判断,可以使用curl查看响应头:
curl-Ihttps://example.com如果网站有跳转,可以继续跟随跳转:
curl-ILhttps://example.com返回结果中会看到真实状态,例如:
HTTP/2 502 server: nginx或者:
HTTP/1.1 504 Gateway Time-out Server: nginx如果前面使用了 CDN,还要注意这个错误页面可能来自 CDN,而不一定是源站 Nginx。
二、查看 Nginx 错误日志
确认状态码后,第一步不是马上修改超时时间,而是查看错误日志:
tail-n100/var/log/nginx/error.log实时观察日志:
tail-f/var/log/nginx/error.log宝塔面板安装的 Nginx,网站日志也可能位于:
/www/wwwlogs/可以先查找日志文件:
find/www/wwwlogs-typef-name"*.log"-size+02>/dev/null不同日志内容通常对应不同原因。
1. connect() failed
例如:
connect() failed (111: Connection refused) while connecting to upstream这通常说明 Nginx 无法连接后端服务,常见原因包括:
- PHP-FPM 没有启动;
- Node.js、Java 或 Python 服务已经停止;
- Nginx 配置的端口错误;
- 上游服务只监听了其他地址;
- Unix Socket 文件不存在或权限不正确。
2. upstream timed out
例如:
upstream timed out (110: Connection timed out) while reading response header from upstream这表示 Nginx 已经连接到后端,但后端程序迟迟没有返回响应,最终触发超时。
常见原因有:
- 数据库查询时间过长;
- PHP 脚本卡住;
- 外部接口响应缓慢;
- 后端任务执行时间过长;
- 服务器 CPU 或内存资源不足。
三、确认后端服务是否运行
如果 Nginx 反向代理到本机的127.0.0.1:8080,可以查看端口监听情况:
ss-lntp|grep8080如果没有任何结果,通常说明后端服务没有启动,或者实际监听的端口不是 8080。
可以直接绕过 Nginx 请求后端:
curl-vhttp://127.0.0.1:8080/如果本地请求也失败,问题基本在上游服务,而不是 Nginx。
对于 PHP 网站,可以检查 PHP-FPM:
systemctl status php-fpm有些服务器安装了多个 PHP 版本,服务名称可能是:
systemctl list-units--type=service|grep-iphp找到真实服务名称后,再查看运行状态和日志。
四、检查 Nginx 配置的地址是否一致
反向代理配置可能类似:
location / { proxy_pass http://127.0.0.1:8080; }如果程序实际监听的是127.0.0.1:3000,Nginx 却请求 8080,就会返回 502。
修改配置后,先检查语法:
nginx-t确认没有错误,再平滑重新加载:
nginx-sreload使用 PHP-FPM 时,还要确认fastcgi_pass指向的端口或 Socket 是否真实存在:
fastcgi_pass unix:/run/php/php-fpm.sock;可以使用下面的命令检查 Socket:
find/run /var/run-types2>/dev/null|grepphp五、504 是否应该直接增加超时时间?
如果后端程序确实需要较长时间,可以适当增加 Nginx 的读取超时时间:
location / { proxy_pass http://127.0.0.1:8080; proxy_connect_timeout 10s; proxy_send_timeout 60s; proxy_read_timeout 120s; }PHP 网站可以设置:
fastcgi_connect_timeout 10s; fastcgi_send_timeout 60s; fastcgi_read_timeout 120s;修改后执行:
nginx-tnginx-sreload但增加超时时间只适合后端任务本来就需要较长时间的情况。如果普通页面也要几十秒才能打开,应该继续检查数据库慢查询、接口请求和程序死循环,而不是单纯把超时时间改得越来越大。
六、检查服务器资源
当 CPU、内存或磁盘出现问题时,上游服务也可能无响应。
查看系统负载:
uptime查看内存:
free-h查看磁盘:
df-h查看当前进程资源占用:
top如果内存耗尽,系统可能会终止 PHP、MySQL 或其他后端进程。可以检查内核日志:
dmesg-T|grep-i-E"out of memory|killed process"七、我的排查顺序
以后再遇到 502 或 504,可以按照下面的顺序处理:
- 用
curl -I确认真实状态码; - 查看 Nginx 的
error.log; - 检查上游服务是否运行;
- 检查端口或 Socket 是否存在;
- 直接请求本机上游地址;
- 检查 CPU、内存和磁盘;
- 最后再考虑调整超时时间。
502 更偏向“连接或响应异常”,504 更偏向“等待上游超时”。先看日志,再根据错误内容处理,通常比反复重启 Nginx 更快找到原因。
文章标签:Nginx、Linux、502、504、服务器运维