关键在于区分是nginx建连后端失败还是内核无法分配新连接:查node是否真监听、协议是否匹配、防火墙/selinux是否拦截;验证临时端口是否耗尽(ss统计+扩大ip_local_port_range);确认node是否被oom killer终止或卡死;通过upstream keepalive、http/1.1复用及超时协同优化减少建连压力。

排查 Nginx 代理 Node.js 在高并发下出现的端口耗尽(TCP Port Exhaustion)和连接拒绝(Connection refused),关键在于分清问题发生的位置:是 Nginx 主动建连后端失败,还是系统内核层面已无法分配新连接。这不是配置写错的问题,而是资源触顶或路径中断的信号。
确认 Connection refused 的真实来源
这个错误不是 Nginx 自己拒绝,而是它调用 connect() 时,内核返回 ECONNREFUSED(即发 SYN 后收到 RST)。常见原因有:
- Node.js 进程根本没在目标地址+端口上监听——检查
netstat -tulnp | grep :3000,再用ps -p PID -o comm,args确认该 PID 确实是你启动的 Node 服务,而非残留进程或调试端口 - Node.js 使用了 Unix socket,但 Nginx 的
proxy_pass写成http://127.0.0.1:3000,协议不匹配导致内核直接拒连;应改为unix:/var/run/node.sock - 防火墙、SELinux 或云平台安全组拦截了出向连接(Nginx → Node)——运行
firewall-cmd --list-all查端口放行,getenforce查 SELinux 状态,临时设为permissive快速验证
排查临时端口是否耗尽
Nginx 作为反向代理,每转发一个请求到 Node,就需占用一个本地 ephemeral port(源端口)。高并发短连接场景下极易耗尽:
- 查当前范围:
cat /proc/sys/net/ipv4/ip_local_port_range,默认是32768 60999(仅约 28K 可用) - 扩宽范围(如允许 1024–65535):
echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range,并写入/etc/sysctl.conf持久化 - 统计已用临时端口数:
ss -ant | awk '$4 ~ /:[0-9]+$/ {print $4}' | cut -d: -f2 | sort | uniq -c | sort -nr | head -5,若频繁接近上限,说明已耗尽 - 配合启用
net.ipv4.tcp_tw_reuse = 1,允许复用 TIME-WAIT 状态端口(需确保后端时间戳开启)
检查 Node.js 侧是否被系统干预
Node.js 进程“看似运行”,但可能已被系统强制终止或无法响应:
- 查 OOM Killer 是否干掉 Node:
dmesg -T | grep -i "killed process" | grep -i node,若有记录,说明内存不足触发回收,需调低 Node 堆内存限制(--max-old-space-size=1024)或扩容 - 查 Node 是否卡死但未退出:用
curl -v http://127.0.0.1:3000/health测试响应,同时看strace -p $(pgrep node)是否长期阻塞在epoll_wait或read - 检查 Node 连接池是否打满:若用了
agentkeepalive,确认maxSockets和maxFreeSockets设置合理(如 128/32),避免空闲连接占满端口却无实际复用
协同优化 Nginx 与 Node 的连接生命周期
减少建连压力,才能从根本上缓解端口紧张:
- Nginx upstream 开启 keepalive:例如
keepalive 128;,并配套设置proxy_http_version 1.1;和proxy_set_header Connection ""; - Node.js 服务启用 HTTP Keep-Alive:确保响应头不含
Connection: close,尤其注意中间件、WAF 或错误处理逻辑是否误加该头 - 统一超时策略:Nginx 的
proxy_connect_timeout(建议 5s)、proxy_read_timeout(建议 30s)应略小于 Node 的server.timeout(如 35s),避免连接半开僵死 - 限制单 worker 文件描述符数:
worker_rlimit_nofile 65535;,并确保系统级 ulimit 已同步调整(/etc/security/limits.conf中nginx soft nofile 65535)











