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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:55:06