配置Gunicorn部署的Flask应用在指定路径下运行
解决思路
1. 先确认流量是否真的到达服务器
日志无记录说明请求可能根本没传到Gunicorn,先验证这一点:
- 在服务器上执行监听命令(假设Gunicorn使用8000端口):
tcpdump -i any port 8000 - 访问
example.com/foo/bar,查看是否有数据包输出。如果没有,问题出在AWS转发配置:- 检查ALB(或其他负载均衡)的路径规则,确认
/foo/bar/*的请求是否正确转发到服务器的Gunicorn端口 - 验证安全组、NACL是否允许对应端口的流量(比如8000)
- 检查是否存在路径重写错误,比如是否把
/foo/bar转发成了空路径,或者转发到了错误端口
- 检查ALB(或其他负载均衡)的路径规则,确认
2. 修正Flask的前缀配置
APPLICATION_ROOT主要用于URL生成,不直接处理路由匹配,要让Flask正确识别/foo/bar前缀,需要设置SCRIPT_NAME:
- 启动Gunicorn时指定环境变量:
SCRIPT_NAME=/foo/bar gunicorn app:app - 或者在Flask代码中设置(推荐用环境变量更灵活):
app.config['SCRIPT_NAME'] = '/foo/bar'
配置后,Flask会自动把/foo/bar作为路由前缀,原来的@app.route('/')就会匹配/foo/bar请求。
3. 检查反向代理配置(如果有)
如果服务器前部署了Nginx之类的反向代理,确保配置正确传递前缀:
location /foo/bar/ { proxy_pass http://localhost:8000/; # 必须设置SCRIPT_NAME让Flask识别前缀 proxy_set_header SCRIPT_NAME /foo/bar; # 保留原请求头信息 proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
注意proxy_pass末尾的/会把/foo/bar/后的路径转发到Gunicorn的根路径,配合SCRIPT_NAME就能正确匹配路由。
4. 修正路由跳转逻辑
你的根路由使用了硬编码的redirect('/app/example'),会忽略前缀导致跳转到example.com/app/example而非example.com/foo/bar/app/example,应该用url_for生成URL:
from flask import url_for @app.route('/') def index(*args, **kwargs): return redirect(url_for('app_example')) # 假设/app/example对应的函数名为app_example
5. 验证Gunicorn日志配置
确保Gunicorn能记录访问日志,启动时加上参数:
gunicorn --access-logfile - --error-logfile - app:app
这样访问日志会输出到终端,方便确认是否有请求到达Gunicorn。
内容的提问来源于stack exchange,提问作者Richard McCormick
相关产品推荐
相关产品推荐

