Nginx客户端长时间无响应需分层排查:先查error.log中“upstream timed out”及括号内阶段提示锁定问题环节,再用curl、nc等工具逐跳验证链路通畅性,最后检查proxy_connect/read/send_timeout等配置是否合理生效并排除资源瓶颈。

客户端长时间无响应,不一定是后端慢或网络差,而是Nginx在某个环节“卡住”了连接。关键要区分是客户端侧断连、代理链路挂起,还是上游根本没响应——得从日志线索出发,逐层验证。
先看 error.log 锁定超时阶段
打开 /var/log/nginx/error.log,搜索 upstream timed out 或 resolving timed out,重点看括号里的提示:
-
while connecting to upstream → TCP 连接建不起来,查
proxy_connect_timeout和后端端口/防火墙 -
while reading response header from upstream → 后端已连上但迟迟不发响应头,盯
proxy_read_timeout和上游处理逻辑(如数据库锁、线程池满) -
while sending request to upstream → Nginx 发请求体卡住,比如大文件上传被阻塞,对应
proxy_send_timeout - 出现 resolving timed out → DNS 解析卡顿,说明
resolver配置缺失或 nameserver 不可用
用工具实测每一跳是否通畅
别只信配置,动手测真实路径:
- 客户端到 Nginx:用
curl -w "@format.txt" http://domain/看time_connect和time_starttransfer,判断延迟是否发生在入口 - Nginx 到上游 IP:Port:运行
nc -zv 192.168.1.100 8080,如果耗时超 1 秒或失败,说明网络或后端监听异常 - 绕过 Nginx 直连上游:
curl http://192.168.1.100:8080/api/test,确认后端本身能快速返回且响应格式合法
检查 timeout 配置是否生效且合理
全局搜配置,避免局部覆盖遗漏:
- 执行
egrep 'proxy_(connect|read|send)_timeout|client_(header|body)_timeout' /etc/nginx/*.conf -
proxy_connect_timeout内网设 3–5s,跨可用区 5–8s,别留默认 60s -
proxy_read_timeout是 504 主因,普通接口 15–30s 足够;报表导出等长任务才单独 location 覆盖 - 别漏
client_header_timeout(建议 10–20s)和send_timeout(建议 20–60s),它们影响客户端侧空闲行为
排查非配置类隐性卡点
很多“无响应”其实是资源挤占或协议层僵死:
- 用
ss -tni | grep ESTABLISHED查大量长时间 ESTABLISHED 连接,可能是上游卡住未发 FIN - 检查上游服务线程池/连接池是否打满(如 Tomcat maxThreads、PHP-FPM pm.max_children)
- 若用域名 proxy_pass,确认
upstream中 server 加了resolve,且resolver指令存在并配了多个 nameserver - TCP 代理(stream 模块)需关注
proxy_timeout,它控制双向静默超时,默认 600s,对数据库/MQ 场景常需调大


















