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

如何配置Apache反向代理转发请求到Docker部署的Flask/Gunicorn应用

问题根源

你遇到的应用内链接失效问题是两个核心原因导致的:

  1. Flask生成资源、路由URL时不知道服务挂载在/flask_app子路径下,默认生成/开头的根路径链接
  2. 现有Apache配置没有将HTTPS协议、子路径前缀信息传递给容器内的Gunicorn/Flask,导致应用生成的链接协议、路径与实际访问地址不匹配

解决方案(无需额外部署Nginx)

你完全可以靠现有Apache+Docker的架构解决问题,不需要额外引入Nginx增加维护成本,按以下步骤调整即可:

第一步:开启Apache必要模块

首先确保Apache已经加载代理、头部处理所需模块,执行命令:
sudo a2enmod proxy proxy_http headers && sudo systemctl restart apache2

第二步:修正Apache虚拟主机配置

替换你原有的反向代理配置为以下内容:

# 传递正确的协议、前缀信息给上游Flask应用
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Prefix "/flask_app"
RequestHeader set SCRIPT_NAME "/flask_app"

# 原有反向代理规则保留,新增Cookie路径修正规则
ProxyPass /flask_app http://127.0.0.1:4000/ connectiontimeout=3600 timeout=3600
ProxyPassReverse /flask_app http://127.0.0.1:4000/
ProxyPassReverseCookiePath / /flask_app

<Location /flask_app>
    Require all granted
</Location>

修改完成后重载Apache配置生效:
sudo systemctl reload apache2

第三步:配置Flask识别子路径

你提到无法给容器内的Flask传递环境变量,实际上Docker传环境变量非常简单,有两种可选方案:

方案A:Docker启动时注入环境变量

启动容器时新增两个环境变量参数即可,不用修改应用代码:

  • 用docker run启动的话,命令增加-e参数:
    docker run -d -p 4000:4000 -e APPLICATION_ROOT="/flask_app" -e SCRIPT_NAME="/flask_app" 你的Flask镜像名
  • 用docker-compose部署的话,在服务配置下新增environment字段:
services:
  your-flask-app:
    image: 你的Flask镜像名
    ports:
      - "4000:4000"
    environment:
      - APPLICATION_ROOT=/flask_app
      - SCRIPT_NAME=/flask_app

方案B:直接修改Flask代码配置

如果不想调整Docker启动参数,直接在Flask入口文件中添加一行配置即可:

app = Flask(__name__)
# 新增这行配置子路径前缀
app.config['APPLICATION_ROOT'] = '/flask_app'

验证效果

配置完成后重启Flask容器,再次访问https://oneofoursites.com/flask_app,应用内的路由、静态资源链接都会自动带上/flask_app前缀,可正常访问。

内容的提问来源于stack exchange,提问作者Dale W.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:06:05