connection refused 是内核返回 rst 表明目标地址端口无监听进程或被系统策略拦截;需用 ss/netstat 确认真实监听状态,检查防火墙/selinux/安全组,验证 ephemeral port 与文件描述符限制,并通过 tcpdump 抓包定位 rst 发送方。

报 Connection refused 不是 Nginx 配置错了,而是它在操作系统层面被明确拒绝建连——内核返回了 RST 包,说明目标地址+端口根本没有监听进程,或被系统级策略拦截。排查必须下沉到内核网络栈和资源层,不能只查配置或日志。
确认监听行为是否真实生效
服务“启动了”不等于“监听了”。常见陷阱是监听地址绑定错误或端口冲突:
- 运行
ss -tuln | grep :8080,检查输出中 Listen 地址是否为0.0.0.0:8080或具体网卡 IP;若只显示127.0.0.1:8080,则远程 Nginx 无法访问 - 对比
netstat -tulnp | grep :8080中的 PID,再用ps -p PID -o pid,comm,args确认该进程确实是你的后端应用,而非残留旧进程或调试工具 - Docker 场景下,执行
docker port <container></container>核对宿主机端口映射是否正确(如8080->0.0.0.0:3000表示容器内 3000 映射到宿主机 8080) - 若使用 Unix socket,Nginx 的
proxy_pass必须写成unix:/tmp/app.sock,而非http://127.0.0.1:8080,否则协议错配直接拒连
检查内核资源与连接限制
低配机器或高并发场景下,资源耗尽会导致新连接被内核静默拒绝:
- 查看临时端口范围:
cat /proc/sys/net/ipv4/ip_local_port_range,默认32768 60999(仅约 28K 可用),压测时易耗尽;可扩至1024 65535 - 检查当前已分配的 ephemeral port 数量:
netstat -an | awk '$4 ~ /:[0-9]+$/ {print $4}' | cut -d: -f2 | sort | uniq -c | sort -nr | head -10 - 确认文件描述符限制:
cat /proc/$(pgrep nginx)/limits | grep "Max open files",若为 1024,需在/etc/security/limits.conf中调高,并重启 nginx worker 进程 - 排查 OOM Killer 是否干掉后端:运行
dmesg -T | grep -i "killed process",若有 Java 或 Node 进程被杀,说明内存不足触发强制回收
验证防火墙、SELinux 与安全组链路
这些组件可在连接到达监听进程前就截断请求,且不记录详细日志:
- CentOS 7 默认启用 firewalld:
firewall-cmd --list-all,确认目标端口(如 8080)在publiczone 的ports列表中;若用 iptables,运行sudo iptables -L OUTPUT -n -v查看出向规则是否放行 - SELinux 可能阻止 Nginx 访问网络:
getenforce若为Enforcing,临时设为 permissive:sudo setenforce 0测试是否恢复;若确认是 SELinux 导致,用audit2why -a分析拒绝日志并生成策略 - 云环境务必检查双侧安全组:Nginx 所在机器的 出方向(egress) 规则要允许访问后端端口;后端机器的 入方向(ingress) 规则也要放行该端口和源 IP 段
- 容器平台(如 Kubernetes)注意 CNI 插件行为:Calico 或 Flannel 可能因 NetworkPolicy 或节点间路由异常导致跨节点通信失败,可用
ip route get <backend-ip></backend-ip>验证路由路径
抓包定位 RST 发出方
仅靠日志无法判断谁发的 RST。在 Nginx 服务器上抓包,直击内核决策:
- 运行
sudo tcpdump -i any host <backend-ip> and port <backend-port> -w conn_refused.pcap</backend-port></backend-ip> - 复现问题后,用 Wireshark 打开 pcap,过滤
tcp.flags.reset == 1 - 若 RST 来自 Nginx 本机 IP → 说明内核拒绝连接(监听未生效或资源满)
- 若 RST 来自 后端 IP → 说明后端服务主动拒绝(进程崩溃、ACL 限流、TLS 协商失败等)
- 若全程无 SYN/ACK,只有超时 → 说明中间设备(防火墙、LB)静默丢包,非 Connection refused
本质上,Connection refused 是内核说“没人应门”,不是 Nginx 在抱怨。把排查锚点从应用层拉回到 netfilter、socket 绑定、资源限额和安全模块,才能真正触达根因。











