本质是Nginx作为代理客户端因高频短连接导致本地临时端口耗尽而无法建连;需先用ss -s、sysctl net.ipv4.ip_local_port_range、ss -tan state time-wait | wc -l三命令精准定位,再扩大端口范围至1024–65535、启用tcp_timestamps=1与tcp_tw_reuse=1、调优tcp_fin_timeout=30,并同步检查conntrack及文件句柄限制。

这个错误本质是 Nginx 作为代理客户端,向外发起连接时拿不到可用的本地源端口,不是后端连不上,而是它自己“没号可拨”了。核心在 TCP 连接生命周期管理,尤其高频短连接场景下极易触发。
确认是不是真端口耗尽
别一看到报错就改内核参数。先用三行命令快速验证:
-
看连接状态分布:运行
ss -s,重点关注time-wait数量是否远超established(比如 28000 vs 400) -
查可用端口范围:执行
sysctl net.ipv4.ip_local_port_range,若输出是32768 60999,则仅约 28232 个端口可用 -
数已占 TIME_WAIT 端口:运行
ss -tan state time-wait | wc -l,结果接近或超过上一步差值,基本锁定端口枯竭
检查上游连接行为是否合理
Nginx 自身配置和上游服务调用方式会显著影响端口消耗速度:
- 确认
upstream块中是否启用了keepalive,例如keepalive 32;,并确保 proxy_pass 后有proxy_http_version 1.1;和proxy_set_header Connection ''; - 排查业务代码是否频繁新建 HTTP 客户端(如 Python 的
requests.get()每次都新建 session),应复用 client 或使用 connection pool - 检查健康检查频率是否过高,
max_fails=1 fail_timeout=1s类配置可能引发密集探测,加剧连接开销
调整内核参数提升端口周转效率
端口供给和回收必须协同优化,以下为当前稳定有效的组合:
-
扩大端口池:设为
1024 65535,临时生效:sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535" -
启用安全复用:必须同时开启
net.ipv4.tcp_timestamps = 1和net.ipv4.tcp_tw_reuse = 1;tcp_tw_recycle已废弃且在 NAT 环境下会导致连接失败,务必禁用 -
调优 FIN 超时:设
net.ipv4.tcp_fin_timeout = 30,加快连接终结节奏,不改变 TIME_WAIT 时长但提升整体周转率
别漏掉 conntrack 和文件句柄限制
端口耗尽常伴随其他资源瓶颈,需一并检查:
- 运行
cat /proc/sys/net/netfilter/nf_conntrack_count对比nf_conntrack_max,若接近上限,需增大net.netfilter.nf_conntrack_max - 检查 Nginx worker 进程打开文件数:
ps -eo pid,comm,rlimit_nofile | grep nginx,确保worker_rlimit_nofile配置足够(如设为65536) - 确认系统级限制:
ulimit -n应 ≥ Nginx 配置值,并在/etc/security/limits.conf中对 nginx 用户持久设置


















