You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:49:58