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

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中指定该启动命令。

验证步骤

  1. 进入Nginx容器,测试Flask连通性:
    docker exec -it 你的webserver容器名 curl http://flask-app:5000/predict
    
    若能得到Flask的响应,说明容器间转发链路正常。
  2. 重启所有容器,用前端请求Nginx的/predict路径,确认功能正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:28:12