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

Docker容器通信异常:Nginx返回502 Bad Gateway故障排查求助

排查容器间通信502 Bad Gateway问题

核心问题推测:Nginx代理未指定后端服务端口

你的Nginx配置中,proxy_pass仅使用了Docker服务名,但后端服务(authentication-service和service)在容器内部监听的是7001/7002端口,而非默认的80端口,这会导致Nginx无法正确转发请求到后端服务的监听端口,直接返回502。

修正Nginx配置

修改Nginx的location块,在服务名后添加对应端口:

server {
    listen 80 default_server;
    server_name memorial-hub.de;

    location / {
        root /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;
    }

    location /api/v1/auth {
        # 添加authentication-service的容器内部端口7001
        proxy_pass http://authentication-service:7001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        # 可选:添加代理请求头传递真实客户端IP
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /api {
        rewrite /api/(.*) /$1 break;
        # 添加service的容器内部端口7002
        proxy_pass http://service:7002;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

额外排查步骤

  1. 确认后端服务是否正常启动并监听端口

    • 进入后端容器,查看服务监听状态:
      # 检查authentication-service容器
      docker exec -it authentication-service-c netstat -tulpn | grep 7001
      # 检查service容器
      docker exec -it memorial-service-c netstat -tulpn | grep 7002
      
    • 如果服务未监听端口,检查后端服务的启动日志,确认是否因数据库连接失败导致启动失败:
      docker logs authentication-service-c
      docker logs memorial-service-c
      
    • 注意:depends_on仅保证postgres容器启动,但postgres可能需要几秒时间初始化完成,可在后端服务添加启动重试逻辑,或者使用wait-for-it等工具等待postgres就绪。
  2. 验证后端服务的接口路径匹配

    • 从Nginx容器直接向后端服务发送请求,测试接口是否可达:
      # 测试authentication-service的auth接口
      docker exec -it memorial-client-c curl http://authentication-service:7001/api/v1/auth/login -X POST -d '{"username":"test","password":"test"}'
      # 测试service的接口
      docker exec -it memorial-client-c curl http://service:7002/health
      
    • 如果请求返回404,说明后端接口路径与Nginx转发的路径不匹配,需要调整Nginx的rewrite或proxy_pass配置。
  3. 检查数据库连接配置

    • 你的后端环境变量中数据库地址使用了*****,需要替换为Docker服务名postgres(同网络下可直接通过服务名访问):
      # 修改service的环境变量
      environment:
        URS_DATABASE_URL: r2dbc:postgresql://postgres:5432/memorial
      # 修改authentication-service的环境变量
      environment:
        URS_DATABASE_URL: jdbc:postgresql://postgres:5432/ap
      
    • 错误的数据库地址会导致后端服务无法连接数据库,进而启动失败或无法处理请求,最终引发Nginx 502。
  4. 确认Nginx用户权限

    • 你将Nginx运行用户设置为nobody,虽然已设置chmod -R a+rx,但可临时切换回root测试是否因权限问题导致转发失败:
      • 注释掉Dockerfile中的USER nobody,重新构建前端镜像后测试。

内容的提问来源于stack exchange,提问作者Terraya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:02:05