Docker容器内Nginx配置出现502 Bad Gateway问题排查求助
当前环境:
- 两个Docker容器:Angular+Nginx(监听4200)、Spring Boot+PostgreSQL(监听8080)
- 已配置Certbot SSL证书,容器运行正常,但访问页面出现502错误
以下是可能的原因及排查方向:
Docker容器网络隔离问题
Docker容器默认有独立的网络栈,你在Nginx容器里用localhost指向的是容器自身,不是宿主机或Spring Boot容器。如果两个容器没在同一个自定义网络里,Nginx根本找不到后端服务。
排查:- 执行
docker network ls查看容器所在网络,确保两个容器在同一自定义网络(比如提前创建的app-network) - 改用容器名称或容器IP作为proxy_pass目标,比如
proxy_pass http://spring-boot-container:8080;(容器名称需在启动时用--name指定)
- 执行
Spring Boot端口映射或服务绑定地址错误
如果Spring Boot容器没把8080端口映射到宿主机,或者服务只绑定了127.0.0.1,外部(包括Nginx容器)都无法访问。
排查:- 执行
docker ps查看Spring Boot容器的PORTS列,确认存在0.0.0.0:8080->8080/tcp这类端口映射 - 查看Spring Boot启动日志,确认服务绑定地址是
0.0.0.0(日志会显示类似Started Tomcat on port(s): 8080 (http) with address 0.0.0.0),如果是127.0.0.1,需在启动参数中添加--server.address=0.0.0.0或修改application配置文件
- 执行
Nginx反向代理语法错误
proxy_pass必须带协议头,若写成proxy_pass localhost:8080;会被Nginx识别为本地文件路径,直接导致502。必须写完整格式:http://目标地址:端口,比如proxy_pass http://172.17.0.3:8080;(容器IP)或http://spring-boot-service:8080;(Docker服务名)防火墙/安全组拦截
VPS的系统防火墙(如ufw、firewalld)或云服务商的安全组,可能拦截了容器间通信,或未开放80/443端口供外部访问。
排查:- 临时关闭防火墙测试,看是否恢复正常
- 检查安全组规则,确保入站方向允许80、443端口,且容器所在网段(如172.17.0.0/16)的通信不受限制
Certbot配置覆盖反向代理规则
Certbot自动生成的SSL配置可能覆盖了你自定义的location规则,导致反向代理未生效。
排查:
查看Nginx站点配置文件(如/etc/nginx/sites-available/your-domain.conf),确认反向代理的location块在SSL配置块内,且未被注释或覆盖
内容的提问来源于stack exchange,提问作者ЗЛАТЕН

