现象

访问网站时,浏览器返回 502 Bad Gateway 或 504 Gateway Timeout 错误。查看 Nginx 错误日志(通常位于 /var/log/nginx/error.log),发现类似 connect() failed (111: Connection refused) while connecting to upstream 的报错信息。这表明 Nginx 进程本身运行正常,但它无法连接到后端的上游服务(如 PHP-FPM、Java 应用或 Node.js 服务)。

原因

该错误核心在于“连接被拒绝”,常见原因包括:1. 后端服务(如 PHP-FPM、Tomcat、Node.js)未启动或已崩溃;2. 后端服务监听的端口或 IP 地址与 Nginx 配置中的 proxy_pass 或 fastcgi_pass 不一致;3. 后端服务只监听了 127.0.0.1,而 Nginx 配置指向了容器 IP 或其他网卡 IP;4. 防火墙(firewalld/ufw)或安全组规则拦截了本地回环流量(较少见,但在特定网络命名空间下可能发生);5. 后端服务处理超时,导致 Nginx 主动断开连接。

先自查(3 分钟)

首先确认后端服务进程是否存在。如果是 PHP-FPM,检查服务状态;如果是 Java 或 Node 应用,检查进程列表。接着检查端口监听情况,确认后端服务是否在 Nginx 配置的端口上监听。最后,使用 curl 或 telnet 模拟 Nginx 的行为,直接测试后端端口连通性。这一步能在 3 分钟内排除 80% 的进程未启动或端口错误问题。

解决步骤

1. 检查后端服务状态。以 Ubuntu 22.04 为例,假设后端是 PHP-FPM:

systemctl status php-fpm

如果状态显示 inactive (dead) 或 failed,尝试启动服务:

systemctl start php-fpm

2. 确认监听端口和地址。假设 Nginx 配置指向 127.0.0.1:9000,检查 PHP-FPM 是否在该地址监听:

ss -tlnp | grep 9000

输出应包含 127.0.0.1:9000 或 0.0.0.0:9000。如果只看到其他 IP,需修改 PHP-FPM 配置文件(通常位于 /etc/php-fpm.d/www.conf 或 /etc/php/8.1/fpm/pool.d/www.conf),修改 listen 参数,然后重启 PHP-FPM。

3. 检查 Nginx 配置。编辑 Nginx 站点配置,确认 fastcgi_pass 或 proxy_pass 的地址和端口正确:

vim /etc/nginx/conf.d/default.conf

4. 测试连通性。使用 curl 直接请求后端端口,模拟 Nginx 行为:

curl -v http://127.0.0.1:9000

如果 curl 能收到响应(即使是 501 Not Implemented),说明网络层连通,问题可能在应用层配置;如果报 Connection refused,说明端口未监听或防火墙拦截。

5. 检查防火墙。如果上述步骤均正常,检查本地防火墙是否放行本地回环流量。在 CentOS 7 上:

firewall-cmd --list-all

确保 lo 接口或对应端口未被拒绝。在 Ubuntu 22.04 上,检查 ufw status。

验证

修改配置或重启服务后,重载 Nginx 配置并检查状态:

nginx -t
systemctl reload nginx

再次访问网站,确认不再返回 502 错误。查看 Nginx 错误日志,确认不再出现 connect() failed 记录。

预防

1. 配置健康检查。在 Nginx 中配置 proxy_next_upstream 或监控工具(如 Prometheus + blackbox_exporter)对后端端口进行定期探测,及时发现服务宕机。2. 使用 systemd 托管后端服务,确保服务崩溃后自动重启。3. 在部署脚本中增加端口监听检查步骤,确保服务启动成功后再启用 Nginx。4. 保持 Nginx 与后端服务配置文件的一致性,修改 IP 或端口时同时更新两边配置。

在奇异互动如何最快处理

若通过上述步骤仍无法解决,或怀疑是云服务器底层网络/内核问题,请进入奇异互动会员中心。首先,进入「云服务器」详情页,使用「VNC 控制台」登录系统,检查系统日志(dmesg)是否有 OOM Killer 杀死后端服务的记录,或检查网卡状态。若确认是软件配置问题,自行修复;若怀疑是云服务器实例本身网络异常,可点击「重启」按钮尝试恢复网络栈。若问题依旧,请在「工单」中提交工单,关联具体的云服务器产品,并附上:1. Nginx 错误日志片段;2. ss -tlnp 的输出;3. 后端服务的启动日志;4. curl 测试后端端口的结果。这将帮助运维团队快速定位是实例网络问题还是配置问题。