能否配置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
相关产品推荐
相关产品推荐

