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

配置Gunicorn部署的Flask应用在指定路径下运行

解决思路

1. 先确认流量是否真的到达服务器

日志无记录说明请求可能根本没传到Gunicorn,先验证这一点:

  • 在服务器上执行监听命令(假设Gunicorn使用8000端口):
    tcpdump -i any port 8000
    
  • 访问example.com/foo/bar,查看是否有数据包输出。如果没有,问题出在AWS转发配置:
    • 检查ALB(或其他负载均衡)的路径规则,确认/foo/bar/*的请求是否正确转发到服务器的Gunicorn端口
    • 验证安全组、NACL是否允许对应端口的流量(比如8000)
    • 检查是否存在路径重写错误,比如是否把/foo/bar转发成了空路径,或者转发到了错误端口

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:48:51