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; } }
额外排查步骤
确认后端服务是否正常启动并监听端口
- 进入后端容器,查看服务监听状态:
# 检查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就绪。
- 进入后端容器,查看服务监听状态:
验证后端服务的接口路径匹配
- 从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配置。
- 从Nginx容器直接向后端服务发送请求,测试接口是否可达:
检查数据库连接配置
- 你的后端环境变量中数据库地址使用了
*****,需要替换为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。
- 你的后端环境变量中数据库地址使用了
确认Nginx用户权限
- 你将Nginx运行用户设置为
nobody,虽然已设置chmod -R a+rx,但可临时切换回root测试是否因权限问题导致转发失败:- 注释掉Dockerfile中的
USER nobody,重新构建前端镜像后测试。
- 注释掉Dockerfile中的
- 你将Nginx运行用户设置为
内容的提问来源于stack exchange,提问作者Terraya
相关产品推荐
相关产品推荐

