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

Nginx 本身没有“并发连接挂起”这个独立配置项,所谓挂起,其实是连接在某个环节卡住——比如 DNS 解析不动、上游建连失败、响应迟迟不来,或者空闲连接长期占着不放。解决的关键不是调一个“挂起阈值”,而是从四个真实发生卡点入手,精准控制生命周期和资源占用。
DNS 解析卡顿导致请求挂起
域名解析慢或失败,会让整个请求卡在起步阶段。Nginx 默认只启动时解析一次,后续 DNS 变更或服务器下线后,请求会傻等超时(默认可能长达数分钟)。
- 必须在 http 块中配置
resolver,至少两个可靠 DNS:resolver 114.114.114.114 8.8.8.8 valid=30s; - upstream 中的 server 行要显式加
resolve:server api.example.com resolve; - 设置
resolver_timeout 3s;,避免内网解析拖太久;若环境稳定,可设为 2s。
上游连接与响应超时设置不合理
挂起最常见于 proxy_connect_timeout、proxy_send_timeout、proxy_read_timeout 这三项配置过长或不匹配业务实际。
-
proxy_connect_timeout 3s;—— TCP 握手最多等 3 秒,防 SYN 重传拖垮 worker -
proxy_send_timeout 15s;—— 发完请求后,等后端接收完成不能超过 15 秒 -
proxy_read_timeout 15s;—— 收响应头到收完 body 的总时间,建议设为后端 P95 耗时的 2–3 倍,别全局设成 60s 或更高
连接复用不当引发堆积与挤占
没复用连接 → 频繁建连 → TIME_WAIT 暴涨;复用但不清理 → 空闲连接长期霸占后端资源。
- upstream 块中启用连接池:
keepalive 32;(值建议为单 worker 并发峰值的 1.2–1.5 倍) - location 中强制 HTTP/1.1 并清除 Connection 头:
proxy_http_version 1.1;proxy_set_header Connection ''; - 避免
proxy_buffering off;无节制使用,小响应建议开启缓冲缓解积压。
资源约束与故障传播未隔离
单个慢请求或异常客户端可能拖垮全部 worker,尤其在文件描述符、内存或 CPU 不足时。
- 用
limit_conn_zone $binary_remote_addr zone=addr:10m;+limit_conn addr 16;控制单 IP 并发 - 启用健康检查并快速踢出故障节点:
max_fails=1 fail_timeout=10s;proxy_next_upstream error timeout http_502 http_504; - 检查系统级限制:
cat /proc/$(pgrep nginx)/limits | grep "Max open files",确保 matchworker_rlimit_nofile
不复杂但容易忽略的是:所有“挂起”现象,几乎都源于这四类配置失当或监控缺失,而不是 Nginx 缺少某个神秘开关。











