如何在Azure App Services中将Gunicorn默认sync worker改为eventlet?
解决Azure Web Apps Linux下Gunicorn无法切换到eventlet Worker的问题
以下是排查和解决的关键步骤:
1. 确保eventlet依赖已正确安装
Azure部署时会读取根目录的requirements.txt安装依赖,必须明确添加eventlet和对应版本的flask-socketio:
flask>=2.0.0 flask-socketio>=5.0.0 eventlet>=0.33.0
部署完成后,可通过SSH连接到应用实例,执行pip list确认eventlet已安装。
2. 修正GUNICORN_CMD_ARGS的配置格式
Azure应用设置中,GUNICORN_CMD_ARGS的值不要加双引号,直接填写:
--workers=4 --worker-class=eventlet app:app
如果带引号,Gunicorn会将引号视为参数的一部分,导致无法正确解析worker-class参数,最终 fallback到默认的sync worker。
3. 检查是否存在自定义启动文件
Azure Web Apps Linux会优先使用以下文件的启动命令,覆盖环境变量设置:
- Procfile:根目录下的Procfile内容应为:
web: gunicorn --workers=4 --worker-class=eventlet app:app - startup.txt:如果有这个文件,确保里面的启动命令包含
--worker-class=eventlet参数。
如果存在这些文件,必须同步修改其中的启动命令,否则环境变量的设置不会生效。
4. 查看应用日志定位问题
在Azure门户的「应用服务」→「日志」→「日志流」中,查看Gunicorn启动时的输出:
- 如果看到类似
Failed to import eventlet的错误,说明依赖未安装成功,需要重新部署确保requirements.txt被正确处理。 - 如果看到
Worker class: eventlet的日志,说明配置已生效;如果还是sync,则检查参数是否被其他启动命令覆盖。
5. 代码中添加eventlet monkey patch
在Flask应用的入口文件(如app.py)开头必须添加eventlet的猴子补丁,否则异步功能无法正常工作:
import eventlet eventlet.monkey_patch() # 这行必须放在所有其他导入之前 from flask import Flask from flask_socketio import SocketIO app = Flask(__name__) socketio = SocketIO(app, async_mode='eventlet')
6. 强制重启应用
修改配置或代码后,必须在Azure门户点击「重启」按钮,或者使用Azure CLI命令:
az webapp restart --name <你的应用名称> --resource-group <你的资源组名称>
确保新的配置完全生效。
内容的提问来源于stack exchange,提问作者Minhong Mi
相关产品推荐
相关产品推荐

