nginx代理请求挂起需从dns解析、上游通信、连接管理、资源约束四层面协同治理:配置resolver及resolve实现快速dns失败切换;精准设置connect/send/read超时;启用upstream keepalive与合理缓冲;结合健康检查与日志观测实现自动兜底。

请求挂起在 Nginx 代理环境中通常表现为客户端长时间无响应、连接卡在 ESTABLISHED 状态、或日志中反复出现 resolving timed out / upstream timed out。这不是单一配置能解决的问题,而是需从 DNS 解析、上游通信、连接管理、资源约束四个层面协同治理。
DNS 解析卡顿:让域名解析快失败、快切换
当 proxy_pass 或 upstream server 使用域名且未正确启用运行时解析时,Nginx 默认只在启动时解析一次——后续 DNS 变更或服务器宕机将导致所有请求持续等待(甚至长达数分钟)。关键不是“等更久”,而是“判得准、切得快”:
- 必须配置
resolver指令,并指定至少两个稳定 nameserver(如resolver 114.114.114.114 8.8.8.8 valid=30s;) - upstream 中的 server 必须显式加
resolve(例如server api.example.com resolve;),否则不触发实时解析 - 设合理的
resolver_timeout:内网用2s,混合环境用5s,高敏系统配3s+valid=15s缩短缓存周期 - 禁用 IPv6 时确保 nameserver 支持 A 查询,避免因只响应 AAAA 而隐式阻塞
上游连接与响应阻塞:精准控制三类超时
挂起常发生在建连、发请求或读响应任一环节。默认 60 秒超时在 CDN 回源或微服务调用中极易放大故障影响:
-
proxy_connect_timeout控制 TCP 握手耗时,建议设为3–5s(避免 SYN 重传拖满 worker) -
proxy_send_timeout限制完整请求(含 body)发送完成时间,大文件上传可放宽至30–60s -
proxy_read_timeout是最易被忽视的关键项,它涵盖从收到响应头到收完全部 body 的总时长,建议设为15–30s;若后端确需长响应(如报表导出),应单独 location 配置,而非全局放宽
连接复用与资源挤占:防单点拖垮全局
高频回源场景下,未复用连接会快速耗尽 worker_connections;而一个慢响应又可能长期占用 buffer 和 connection,引发雪崩:
- 启用 upstream keepalive:在 upstream 块中加
keepalive 32;,并在 location 中配proxy_http_version 1.1;和proxy_set_header Connection ''; - 限制单请求资源占用:用
client_max_body_size 10m;拦截超大上传,避免缓冲区溢出 - 合理设置缓冲机制:
proxy_buffering on;+proxy_buffer_size 4k;+proxy_buffers 8 16k;可缓解小响应积压;对流式内容(视频、日志)则关 buffering 并禁用 cache - 通过
worker_connections 1024;和worker_rlimit_nofile显式约束并发上限,防止 DNS 卡顿或上游失联耗尽全部 worker
自动兜底与可观测性:让故障不蔓延、可定位
仅靠超时不够,还需主动探测和失败转移能力:
- 启用健康检查:在 upstream 中为每个 server 设置
max_fails=2 fail_timeout=10s;,配合proxy_next_upstream error timeout invalid_header http_502;实现自动摘除与重试 - 验证 resolver_timeout 是否真生效:临时将
resolver改为不可达地址(如192.0.2.1),观察 error.log 是否在设定秒数后准确报resolving timed out - 检查日志中的关键线索:关注
upstream timed out(读超时)、connect() failed(建连失败)、no live upstreams(全节点被摘)、could not be resolved(DNS 失败)等错误模式











