如何配置Apache反向代理转发请求到Docker部署的Flask/Gunicorn应用
问题根源
你遇到的应用内链接失效问题是两个核心原因导致的:
- Flask生成资源、路由URL时不知道服务挂载在
/flask_app子路径下,默认生成/开头的根路径链接 - 现有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.
相关产品推荐
相关产品推荐

