Docker Compose配置NGINX反向代理失效问题求助
我帮你梳理几个排查方向和解决方案,应该能搞定这个proxy_pass不工作的问题:
1. 把容器名换成服务名(更稳定的DNS解析)
Docker Compose默认会给每个服务分配一个DNS别名,就是你在docker-compose.yaml里写的服务名pyweb,这个比自动生成的pyweb_1容器名靠谱多了——毕竟如果以后重启服务或者扩容,容器名可能会变,但服务名始终是pyweb。
修改你的webapp.conf里的proxy_pass配置,去掉多余的引号,换成服务名:
location / { proxy_pass http://pyweb:5000/; }
2. 先检查Nginx配置有没有语法错误
经常会有配置写了个小错误导致Nginx没加载成功,你可以进入Nginx容器验证一下:
# 先用docker ps找到你的Nginx容器名 docker exec -it <你的Nginx容器名> sh # 检查配置语法是否合法 nginx -t
如果输出显示nginx: configuration file /etc/nginx/nginx.conf test is successful,说明配置没问题;如果有错误,跟着提示修正即可。
3. 确认Nginx容器能连上pyweb服务
在Nginx容器里ping一下pyweb,看看网络连通性:
ping pyweb
如果能正常ping通,说明网络链路是好的;如果ping不通,检查下docker-compose.yaml里两个服务是不是都在webapp网络里——你的配置里已经加了networks: - webapp,大概率没问题,但还是确认下更放心。
4. 查看Nginx错误日志找具体原因
这一步是排查核心!Nginx的错误日志会明确告诉你请求失败的原因,比如主机无法解析、连接被拒绝等。进入Nginx容器查看日志:
cat /var/log/nginx/error.log
比如如果看到connection refused,可能是pyweb服务没正常启动;如果是no resolver defined,那用服务名pyweb替代容器名就能解决DNS解析问题。
5. 确认pyweb服务确实对外监听
你的Dockerfile里已经设置了FLASK_RUN_HOST=0.0.0.0,这个是正确的(如果设成127.0.0.1,Flask只会监听容器内部,外部访问不到)。可以进pyweb容器验证监听状态:
docker exec -it pyweb_1 netstat -tulpn | grep 5000
如果输出显示0.0.0.0:5000,说明监听配置没问题。
6. 重启Nginx让配置生效
修改完配置一定要重启Nginx才能生效,要么直接重启容器,要么在容器内重载配置:
# 方法1:重启容器 docker restart <你的Nginx容器名> # 方法2:在容器内重载配置 nginx -s reload
按这些步骤走下来,应该就能解决proxy_pass失效的问题了。如果还是不行,把Nginx错误日志的内容贴出来,我再帮你精准定位。
内容的提问来源于stack exchange,提问作者Vic

