Docker Nginx proxy_pass仅前端路由报502 Bad Gateway问题
故障原因
核心问题是混淆了Docker端口映射的作用范围:
- docker-compose中配置的
ports字段,仅用于把容器内部端口映射到宿主机的端口,供宿主机或外部网络访问使用; - 同一docker-compose默认网络内的容器之间互相通信时,直接访问对方容器内部实际监听的端口,完全不经过宿主机的端口映射规则。
对应到你的配置,故障逻辑非常明确:
- 前端服务
frontend容器内部的Nginx实际监听的是80端口,配置里4200:80的映射仅对宿主机生效,容器内部没有任何进程监听4200端口。 - 网关
apigw的Nginx配置中,把前端请求转发到了http://frontend:4200,相当于去连接前端容器不存在的4200端口,自然触发连接拒绝错误。 - 后端接口能正常访问纯属巧合:后端服务内部监听3000端口,端口映射也配置为
3000:3000,网关配置里写的3000端口刚好和容器内部监听端口一致,所以转发逻辑没有报错。
修复步骤
- 修改反向代理(reverseproxy)镜像内的
nginx.conf配置,把前端路径的代理目标端口从4200改为前端容器实际监听的80端口,修正后的location配置如下:
location / { proxy_pass http://frontend:80; proxy_set_header X-Forwarded-For $remote_addr; # 补充常规反向代理请求头,避免前端静态资源、路由跳转时出现host/协议匹配异常 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; }
注:原配置中前端服务的
4200:80端口映射可以保留,不影响容器间通信,仅用于需要从宿主机直接通过4200端口访问前端服务的场景。
- 重新构建reverseproxy镜像,重启apigw容器即可正常访问前端页面。
内容的提问来源于stack exchange,提问作者Iñigo
相关产品推荐
相关产品推荐

