Gunicorn部署Flask应用时如何禁用自动重载功能
解决Gunicorn部署Flask时Werkzeug自动重载的问题
首先明确两个基础前提:
flask run是Flask官方提供的开发用内置服务器命令,和你使用的Gunicorn是完全独立的Web服务器程序,因此flask run的--no-reload参数无法直接和Gunicorn搭配使用。- Gunicorn本身默认不会开启代码重载,只有手动添加
--reload启动参数才会触发Gunicorn自带的重载机制,如果你启动命令中没有加该参数,不用考虑Gunicorn侧的重载配置。
你遇到的自动重载触发原因,是当前的Gunicorn启动命令中,默认使用了FLASK_ENV:-development的配置:当FLASK_ENV为development时,Flask会默认开启Werkzeug内置的调试重载器,即使用Gunicorn启动应用也会触发该机制。
解决方案
方案1:生产环境配置规范(优先推荐)
生产环境直接设置FLASK_ENV=production环境变量即可,该配置下Flask会自动关闭调试模式、禁用Werkzeug重载器,无需修改其他代码或启动参数。
启动命令示例:
# 先设置生产环境变量,再启动Gunicorn export FLASK_ENV=production gunicorn -b 0.0.0.0:5000 \ --workers 12 \ --log-level "${LOGGING_LEVEL}" \ --preload "wsgi:create_app('${FLASK_ENV}')" \ --timeout 240
注:你原有的启动命令存在语法错误,--preload参数行末尾缺少续行符\,会导致命令执行报错,上面的示例已经修正了该问题。
方案2:指定禁用重载(适用于需要保留development环境的场景)
如果你需要保留FLASK_ENV为development,同时要禁用重载,可以在初始化Flask实例时显式指定关闭重载:
修改你wsgi.py中的create_app函数,在生成Flask实例时添加参数:
app = Flask(__name__, use_reloader=False)
或者在应用配置中添加:
app.config["USE_RELOADER"] = False
内容的提问来源于stack exchange,提问作者dirtyw0lf
相关产品推荐
相关产品推荐

