Nginx报错“connect() failed (111: Connection refused)”表明其无法建立到upstream的TCP连接,核心原因是目标IP和端口无进程监听或被防火墙/SELinux等拦截,需依次验证服务监听状态(ss/netstat)、监听地址(0.0.0.0 vs 127.0.0.1)、网络连通性(telnet/nc)、系统策略及proxy_connect_timeout配置合理性。

直接看 Nginx 错误日志里有没有 “connect() failed (111: Connection refused)” 或 “(110: Connection timed out) while connecting to upstream” 这类提示。出现这些,基本就是 proxy_connect_timeout 起作用了——Nginx 连不上后端,不是等不到响应,而是连都连不过去。
确认后端服务是否真在监听且可访问
别只查进程在不在,要验证它是否实际打开了端口、接受连接:
- 用
ss -tuln | grep :端口号或netstat -tuln | grep :端口号看监听地址是不是0.0.0.0:端口或127.0.0.1:端口;若只监听localhost或具体 IP(如192.168.1.100),Nginx 可能因网络栈差异连不上 - 执行
curl -v http://127.0.0.1:端口/health,观察是否返回 200 和有效响应体;失败则说明后端没启动、崩溃、或健康检查路径配置错误 - 容器环境需额外确认:
docker ps看容器状态,docker logs 容器名查启动日志,docker port 容器名核对端口映射是否生效
检查网络与系统级连通障碍
即使后端在监听,中间也可能被拦住:
- 运行
telnet 127.0.0.1 端口或nc -zv 127.0.0.1 端口,测试 TCP 层是否通;不通就不是超时问题,而是连接拒绝本身 - 确认防火墙规则:
iptables -L -n(传统)或ufw status(Ubuntu),重点看 INPUT 和 OUTPUT 链是否放行目标端口 - SELinux 或 AppArmor 启用时,可能阻止 Nginx 建立 outbound 连接,临时用
setenforce 0测试是否缓解(仅验证用)
核对 proxy\_connect\_timeout 配置是否合理
该参数控制 Nginx 建立 TCP 连接的最大等待时间,默认是 60 秒,但实际中常需调整:
- 后端是容器或云服务时,冷启动可能耗时较长,建议设为 30–60 秒;若部署在 Kubernetes,还要考虑 initContainer 初始化、sidecar 注入延迟
- 配置位置必须在
location或server块内,避免被全局默认值覆盖;例如:
location /api {
proxy_pass http://backend;
proxy_connect_timeout 45s;
} - 改完务必执行
nginx -t检查语法,再nginx -s reload生效;切勿只改不验,配置错误也可能间接导致连接失败
排除上游服务自身启动异常
很多“连不上”其实是后端启动失败,但进程还残留着:
- PHP-FPM:检查
systemctl status php-fpm是否 active,再看php-fpm.log里有无failed to listen on address或权限错误 - Node.js:确认
pm2 list或systemctl status myapp中进程状态,同时查 stdout/stderr 日志是否有EADDRINUSE(端口被占)或Cannot find module - Java 应用:检查 JVM 启动日志末尾是否含
Started Application in X seconds;若卡在 “Starting Servlet web server” 阶段,大概率是数据库连接池初始化失败或配置中心超时











