Docker中Nginx SSL终止配置遇502错误:连接上游容器被拒绝
解决Docker中Nginx SSL终止的502 Bad Gateway问题
我来帮你排查这个502错误的问题,从日志里的connect() failed (111: Connection refused)来看,核心原因就是Nginx容器没法成功连接到你的上游容器(端口3001的那个服务)。咱们一步步来定位和解决:
1. 确认两个容器在同一个Docker网络中
Docker容器之间默认的bridge网络通信有局限性,最好使用自定义Docker网络来确保容器能通过名称互相访问:
- 先查看当前的Docker网络列表:
docker network ls - 检查两个容器所属的网络:
docker inspect 3b640f25af44 | grep NetworkMode docker inspect <上游容器ID/名称> | grep NetworkMode - 如果不在同一个网络,创建自定义网络并重新启动容器:
docker network create my-nginx-network # 重启Nginx容器,加入自定义网络 docker run -d --network my-nginx-network --name my-nginx nginx ... # 重启上游容器,加入同一个网络 docker run -d --network my-nginx-network --name my-upstream-app <你的镜像> ...
2. 验证上游容器的3001端口是否正确监听
上游服务可能只绑定了容器内部的127.0.0.1,导致外部容器无法访问:
- 进入上游容器,检查端口监听状态:
docker exec -it <上游容器ID/名称> bash # 用netstat或ss命令检查端口 netstat -tulpn | grep 3001 # 如果没有netstat,安装或用ss ss -tulpn | grep 3001 - 确保输出里的监听地址是
0.0.0.0:3001,而不是127.0.0.1:3001。如果是后者,需要修改你的上游服务配置,让它监听0.0.0.0:3001。
3. 检查Nginx配置中的上游地址是否正确
这是最容易踩坑的点:Nginx配置里的proxy_pass不能写localhost:3001(这指向Nginx容器自己的localhost),必须使用上游容器的名称或者内部IP:
举个正确的SSL终止配置示例:
server { listen 443 ssl; server_name your-domain.com; # SSL证书配置 ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/key.pem; location / { # 这里用上游容器的名称,比如my-upstream-app proxy_pass http://my-upstream-app:3001; # 必要的请求头转发 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; } }
修改配置后,记得重新加载Nginx:
docker exec -it my-nginx nginx -s reload
4. 测试Nginx容器到上游容器的连通性
进入Nginx容器,直接测试能不能访问上游服务:
docker exec -it my-nginx curl http://my-upstream-app:3001 # 或者用telnet测试端口连通 docker exec -it my-nginx telnet my-upstream-app 3001
如果这一步失败,说明是网络或上游容器的问题;如果能成功访问,那可能需要检查Nginx的其他配置细节(比如请求头、SSL配置)。
额外提示
不需要把上游容器的3001端口映射到宿主机,因为Nginx和上游容器是内部Docker网络通信,宿主机端口映射只在你需要直接访问上游服务时才需要。
内容的提问来源于stack exchange,提问作者felix001
相关产品推荐
相关产品推荐

