在最近一次服务器部署中,我遇到一个很棘手的问题:通过域名访问 Nginx 站点时出现 502 Bad Gateway,而本地访问却正常。经过排查,我发现问题与防火墙和代理有关,整个过程总结如下。
问题描述
域名:tcoin1.xyz
Nginx 配置正确,能在本地访问 /index.html
外网访问时却返回:
502 Bad Gateway
服务器上 curl -I http://localhost 正常返回 200 OK
使用浏览器或手机访问域名时,在开启翻墙工具的情况下无法访问,但关闭翻墙后正常
初步分析
502 错误通常由以下原因引起:
Nginx 配置的上游服务不可用或拒绝连接
代理或防火墙阻止了请求
HTTP 请求头缺少必需的 Host 字段
结合实际情况发现:
本地访问 Nginx 正常 → Nginx 本身工作正常
外网访问受影响 → 网络或防火墙问题
开启代理/翻墙访问出现问题 → 请求头或防火墙可能阻止了连接
Nginx 配置检查
Nginx 代理配置示例:
location ~ ^/(api|login|ws|trade|openapi) {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
✅ 关键点:
proxy_set_header Host $host; 确保 Host 头正确传递
上游服务端口 8000 必须可访问
防火墙排查
使用 CentOS 自带 FirewallD:
查看防火墙状态:
sudo firewall-cmd --state
not running 或 running
列出已开放端口:
sudo firewall-cmd --list-all
确保开放端口:
HTTP/HTTPS:80/443
后端服务端口:8000(仅本地访问或外网访问根据需求)
启用防火墙并设置默认规则:
sudo systemctl start firewalld
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“127.0.0.1/32” port protocol=“tcp” port=“8000” accept’ --permanent
sudo firewall-cmd --reload
防火墙状态确认:
sudo firewall-cmd --list-all
域名解析检查
确认域名解析到服务器公网 IP:
nslookup tcoin1.xyz
如果解析不正确,需要修改 DNS 记录
如果解析正确,但外网仍无法访问,可能是云服务提供商安全组或本地防火墙阻止了访问
关键问题总结
502 Bad Gateway 并不一定是 Nginx 配置错误
本例中,问题根源是防火墙未开启或规则不完整,导致 Nginx 无法与上游服务建立连接
启用防火墙并添加必要端口规则后,问题解决
代理工具或翻墙软件可能会改变请求头,务必保证 Host 头正常
最终解决方案
Nginx 配置保持原样,确保 proxy_set_header Host $host
启用防火墙,开放 80/443 端口,允许本地访问 8000
检查域名解析,确认公网 IP 正确
本地测试成功后,外网访问正常
小结
遇到 Nginx 502 错误时,排查顺序建议:
本地访问 Nginx 是否正常
上游服务端口是否开放并运行
防火墙是否阻止访问
DNS 解析是否正确
请求头是否缺少 Host
通过这个案例,可以看到防火墙和代理设置在排查 502 问题时的重要性。
最后发现可能是宝塔端口问题,关闭端口就正常了,真实头大