Nginx 502 与 504 怎么排查?先看上游状态,再看超时原因

网站显示 502 或 504,并不意味着需要重装 Nginx。反向代理站点往往同时经过 CDN、负载均衡、Nginx、应用服务和数据库;错误可能出在其中任意相邻环节。正确顺序是确认报错层、找同一请求的日志,再检查它访问的上游。

先辨认 502 和 504 的含义

在常见代理场景中,502 表示网关未从上游获得有效响应,可能涉及连接被拒绝、上游提前关闭或协议不匹配;504 表示等待上游超时。应用或前置代理也可能返回这两个状态码,因此不能仅凭浏览器页面样式认定是这台 Nginx 生成的错误。

记录请求发生时间、路径、请求标识、是否只有特定接口失败,以及前端是否经过 CDN。检查相关层的访问日志中有没有同一请求。Nginx 根本没有记录该请求时,先核对前置代理、DNS 和日志配置;有记录时,再结合上游状态与错误日志判断。

找到错误发生阶段

在常见 Linux 安装中可以先查看以下信息,日志路径应以本站配置为准:

sudo nginx -t
sudo systemctl status nginx --no-pager
sudo tail -n 100 /var/log/nginx/error.log
sudo ss -lntp

nginx -t 用于检查配置语法与相关文件,不能证明后端应用健康。读取日志时,将时间、请求路径和上游地址连起来看:connect() failed 且附有拒绝连接信息,先查监听端口;upstream prematurely closed connection,先查应用退出、崩溃和资源限制;upstream timed out 则继续看发生在建立连接还是读取响应阶段。

如果站点使用 PHP-FPM 的 FastCGI 通道,应检查对应服务与 socket,不能照搬 HTTP 反向代理的端口假设。socket 路径错误、运行用户无权访问、PHP-FPM 进程池耗尽,都可能表现为网关错误。只修正已确认的路径或权限,不要把 socket 或网站目录统一改成任何人可写。

在 Nginx 所在环境直接测试上游

假设真实配置指向本机 3000 端口,并且应用确实提供无副作用的 /health 检查接口,可以做一次请求:

curl --max-time 5 -sS -o /dev/null -w 'status=%{http_code} total=%{time_total}\n' http://127.0.0.1:3000/health

把地址、端口和路径换成实际值。没有健康检查接口时,选择已确认不会产生写入的页面;不要拿支付、下单或任务创建接口反复测试。连接立即失败时,查看应用是否启动、是否监听预期地址;能连接但超过测试时限时,查看应用线程、数据库连接池及外部依赖。

如果 Nginx 在容器中,127.0.0.1 指向的是该容器自身;宿主机请求成功,不代表容器到上游的路径可用,应在等效网络环境里验证。上游要求特定 Host、HTTPS 或认证时,也要按实际代理条件测试,否则一次返回异常不能直接证明应用故障。

504 要找出时间花在哪里

先对照应用日志判断慢请求是在数据库查询、锁等待、远程 API 还是任务队列中耗时。若只有报表导出超时,普通页面正常,应针对该工作负载优化查询或改为后台任务;若所有接口一起变慢,则更需要检查资源耗尽与共享依赖。

Nginx 的 proxy_connect_timeout 管建立上游连接,proxy_read_timeout 管相邻两次读取上游响应之间的等待,并非整个请求统一的总时长。PHP-FPM 则使用相应的 FastCGI 配置。把所有超时一并加大,可能只是让更多连接长期等待。Nginx HTTP 代理模块文档

访问日志可按需要加入 $request_time$upstream_connect_time$upstream_response_time$upstream_status,对照整体耗时与上游耗时。多次上游尝试时,变量可能包含多个值,应按实际请求链解释;记录时避免写入密码、令牌及敏感正文。Nginx 上游变量文档

修复后,验证实际业务并保留回退

若故障紧随应用发布出现,优先判断能否回退到已验证版本;数据库结构已变化时,必须确认旧版本仍兼容。配置修改前保存原值,语法检查通过后再重新加载;验证既要包含普通页面,也要包含原来失败的业务路径。

对需要增加超时的正常长任务,先确定合理等待上限,再核对 CDN、负载均衡和应用自身的限制是否协调。支付或创建订单请求失败后,不能不加判断地重试,因为服务器可能已完成写入却未成功返回响应。

观察错误比例、响应时间、应用进程与连接池是否恢复稳定。若 502 减少但排队更严重,说明只是改变了症状,应恢复临时参数并继续定位上游瓶颈。把出错请求、日志证据和最终处理方式保留下来,便于下次快速区分同类故障。

参考资料

继续阅读

返回天理云文章中心

分享到:
上一篇
Linux 磁盘满了怎么排查?空间、inode 与已删除文件占用
下一篇
ping、traceroute 和 MTR 怎么看?正确判断延迟与丢包
服务中心
企微客服
企微客服
给您高效服务
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意