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

能否配置Gunicorn让不同Worker处理特定URL分组?

按URL分组分配Gunicorn Worker的实现方案

Gunicorn本身不支持直接将特定URL路由到指定Worker——它的Master进程会随机分发请求给所有Worker。要实现不同Worker处理不同URL分组的需求,最直接的方案是启动多个独立的Gunicorn实例,每个实例绑定不同端口,再通过Nginx做URL路由转发,把对应请求导向指定实例。

步骤1:启动多个Gunicorn实例

针对不同URL分组启动独立的Gunicorn服务,可根据业务需求调整Worker数量(比如大文件处理Worker数少些,计算类Worker数多些):

  • 处理/group1/开头请求的实例:

    gunicorn --workers 2 --worker-class uvicorn.workers.UvicornWorker myproject.wsgi:application --bind 127.0.0.1:8001
    
  • 处理/group2/开头请求的实例:

    gunicorn --workers 4 --worker-class uvicorn.workers.UvicornWorker myproject.wsgi:application --bind 127.0.0.1:8002
    

步骤2:配置Nginx做URL路由

修改Nginx的站点配置文件,添加location规则实现请求转发:

server {
    listen 80;
    server_name yourdomain.com;

    # 转发/group1/请求到8001端口的Gunicorn实例
    location /group1/ {
        proxy_pass http://127.0.0.1:8001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 大文件传输优化配置
        client_max_body_size 100M;
        proxy_connect_timeout 600s;
        proxy_send_timeout 600s;
        proxy_read_timeout 600s;
    }

    # 转发/group2/请求到8002端口的Gunicorn实例
    location /group2/ {
        proxy_pass http://127.0.0.1:8002;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 计算类请求超时配置
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
    }

    # 其他请求可转发到默认实例(按需调整)
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

步骤3:用Systemd管理Gunicorn实例

为每个Gunicorn实例创建Systemd服务,方便启停和开机自启:

针对group1的服务文件(/etc/systemd/system/gunicorn-group1.service)

[Unit]
Description=Gunicorn instance for group1 URLs
After=network.target

[Service]
User=youruser
Group=www-data
WorkingDirectory=/path/to/your/project
ExecStart=/path/to/venv/bin/gunicorn --workers 2 --worker-class uvicorn.workers.UvicornWorker myproject.wsgi:application --bind 127.0.0.1:8001

[Install]
WantedBy=multi-user.target

针对group2的服务文件(/etc/systemd/system/gunicorn-group2.service)

[Unit]
Description=Gunicorn instance for group2 URLs
After=network.target

[Service]
User=youruser
Group=www-data
WorkingDirectory=/path/to/your/project
ExecStart=/path/to/venv/bin/gunicorn --workers 4 --worker-class uvicorn.workers.UvicornWorker myproject.wsgi:application --bind 127.0.0.1:8002

[Install]
WantedBy=multi-user.target

启动并启用服务

sudo systemctl daemon-reload
sudo systemctl enable gunicorn-group1.service gunicorn-group2.service
sudo systemctl start gunicorn-group1.service gunicorn-group2.service

注意事项

  • 每个Gunicorn实例都是独立的进程组,Worker间不会共享内存,从根源避免了共享内存报错问题。
  • 如果应用存在全局共享状态(如全局变量),建议改用Redis、数据库等外部存储实现状态共享,避免实例间数据不一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:23:07