端口资源不足导致连接失败,需协同调优ip_local_port_range、worker_connections及keepalive等参数。默认端口约2.8万个,高qps反向代理易耗尽,建议扩至10240–65535,并配keepalive降低消耗。

两者不冲突,但配置失衡会导致连接失败——常见报错 “Cannot assign requested address” 就是典型信号。关键不是“冲突”,而是 端口资源跟不上连接调度节奏。
为什么看似无关的两个参数会“联动出错”
worker_connections 控制每个 worker 进程能处理的并发连接总数(含客户端连接 + 到 upstream 的 outbound 连接);而 ip_local_port_range 决定本机发起 outbound 连接时可用的源端口数量。当 Nginx 作为反向代理频繁建连后端(尤其短连接、高 QPS 场景),所有 outbound 连接都挤在同一个 local IP 上,此时:
- 可用端口数 ≈ ip_local_port_range 上限 − 下限 + 1(默认约 28,232 个)
- 单个 worker 在峰值时可能需同时打开数千个到同一 upstream IP:PORT 的连接
- 若 worker_connections 设为 65535,但端口范围仍为默认值,多个 worker 并发建连极易耗尽端口
- 系统无法分配新 local_port → connect() 失败 → Nginx 返回 502 或日志报 EADDRNOTAVAIL
快速定位是否为端口瓶颈
不用猜,用命令验证:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 查当前端口范围:
sysctl net.ipv4.ip_local_port_range或cat /proc/sys/net/ipv4/ip_local_port_range - 看端口分配压力:
ss -s | grep "inuse"(关注 inuse 和 ephemeral 行) - 查 TIME_WAIT 占用:
ss -ant | awk '$1 ~ /TIME-WAIT/ {++s} END {print s+0}' - 匹配错误日志:
grep "Cannot assign requested address" /var/log/nginx/error.log
协同调优的关键数值关系
目标是让端口供给 ≥ outbound 连接并发需求。实际中需按最严场景估算:
- 若 upstream 固定为 1 个 IP:PORT,且无 keepalive,则最大并发 outbound 连接 ≈ worker_processes × worker_connections
- 推荐将
net.ipv4.ip_local_port_range扩至 10240 65535(共 55,300+ 端口),避开 1–1023 特权端口和 8000–10239 常见应用端口 - 同时确保
worker_rlimit_nofile≥worker_connections,且系统ulimit -n≥ 该值 - 启用
proxy_set_header Connection ''和keepalive 32(upstream 模块)可显著降低端口消耗
必须同步检查的配套项
只改 port range 或只调 worker_connections 都无效:
-
文件描述符限制:
ulimit -n、worker_rlimit_nofile、/etc/security/limits.conf三者需一致且足够 -
监听队列深度:
net.core.somaxconn建议 ≥worker_connections / worker_processes,否则 accept 队列溢出 -
TIME-WAIT 回收:开启
net.ipv4.tcp_tw_reuse = 1,避免端口被长时间占用 -
上游复用配置:upstream 块内必须配
keepalive 32,并在 location 中用proxy_http_version 1.1+proxy_set_header Connection ""










