EC2上Docker容器中Nginx无法转发请求至Flask的问题排查
Docker容器Nginx转发Flask失败,前端用容器名请求无效问题解决
问题核心原因
你的前端fetch("http://flask-app:5000/predict")是从用户浏览器发起的请求,而非Nginx容器内部请求:
- Docker容器名称
flask-app仅能被Docker内部DNS服务(127.0.0.11)解析,浏览器不在Docker网络范围内,完全识别不了这个名称。 - 用EC2 IP能成功,是因为该IP对外暴露了Flask的5000端口,但这绕开了Nginx的转发逻辑,不符合架构设计初衷。
解决方案
1. 修正前端请求地址
前端应直接请求Nginx对外暴露的80端口,将fetch地址改为以下两种形式之一:
// 相对路径(推荐,适用于前端与Nginx同域名/IP的场景) fetch("/predict", { /* 请求配置项 */ }) // 或使用EC2公网IP/域名 fetch("http://你的EC2公网IP/predict", { /* 请求配置项 */ })
修改后请求会先到达Nginx,再由Nginx转发到Flask容器。
2. 修复Nginx转发路径重复问题
当前Nginx配置的proxy_pass存在路径重复隐患:
location /predict { proxy_pass http://flask-app:5000/predict; // 实际转发路径会变成 http://flask-app:5000/predict/predict,因为location已匹配/prefix }
可改为以下两种方式之一:
// 方式一:移除proxy_pass末尾的/predict location /predict { proxy_pass http://flask-app:5000; // 其余配置保持不变 } // 方式二:用变量保持路径一致性 location /predict { proxy_pass http://flask-app:5000$request_uri; // 其余配置保持不变 }
3. 确保Flask监听0.0.0.0
Flask默认仅监听127.0.0.1,容器外部(包括同一Docker网络的Nginx)无法访问。需修改启动命令:
- 若使用
flask run:flask run --host=0.0.0.0 --port=5000 - 若使用Gunicorn:
gunicorn -w 4 -b 0.0.0.0:5000 app:app
也可直接在Dockerfile中指定该启动命令。
验证步骤
- 进入Nginx容器,测试Flask连通性:
若能得到Flask的响应,说明容器间转发链路正常。docker exec -it 你的webserver容器名 curl http://flask-app:5000/predict - 重启所有容器,用前端请求Nginx的
/predict路径,确认功能正常。
内容的提问来源于stack exchange,提问作者gochx
相关产品推荐
相关产品推荐

