如何用Gunicorn单命令启动不同worker数的同端口Flask服务?
单命令启动多Gunicorn应用并共享端口的方案
问题背景
我在服务器上可以通过以下两条命令启动两个服务:
gunicorn -w 2 server:app1 gunicorn -w 4 server:app2
但每次都要执行两条命令,想知道有没有办法用一条命令同时启动app1和app2,要求app1用2个worker,app2用4个worker,并且二者使用同一端口。
可行解决方案
方案1:使用Gunicorn多应用配置文件
Gunicorn支持通过配置文件定义多个应用,让它们共享同一个监听端口,由主进程统一管理worker资源。
- 创建配置文件
gunicorn_multi.py:
# 绑定目标共享端口 bind = "0.0.0.0:8000" # 导入并定义第一个应用 def app1(): from server import app1 return app1 # 导入并定义第二个应用 def app2(): from server import app2 return app2 # 配置应用列表,指定每个应用的worker数量 applications = [ (bind, app1, {"workers": 2}), (bind, app2, {"workers": 4}) ]
- 执行启动命令:
gunicorn -c gunicorn_multi.py
这种方式下,Gunicorn会启动一个主进程,分别为两个应用分配指定数量的worker,所有worker共享同一端口,请求会被正确路由到对应的应用(注意确保两个应用的路由规则没有冲突)。
方案2:编写统一WSGI入口应用
通过WSGI中间件实现请求分发,把两个应用整合到一个入口,再用Gunicorn启动这个入口,统一分配worker资源。
- 创建入口文件
wsgi_entry.py:
from server import app1, app2 from werkzeug.middleware.dispatcher import DispatcherMiddleware # 根据URL路径分发请求:示例中app1处理根路径,app2处理/api/app2路径 application = DispatcherMiddleware(app1, { '/api/app2': app2 })
- 启动命令(worker总数设为2+4=6,可根据实际负载调整):
gunicorn -w 6 wsgi_entry:application
这种方式下,所有请求通过同一端口进入,中间件会根据预设规则把请求转发给对应的应用,worker资源统一管理,也能满足你的需求。
内容的提问来源于stack exchange,提问作者coin cheung
相关产品推荐
相关产品推荐

