systemd部署Gunicorn运行Flask应用,修改代码不生效如何解决
问题根本原因
gunicorn启动时会一次性将所有依赖的Python代码加载到进程内存中,运行过程中不会主动检测磁盘上的代码文件变更,所以修改代码后默认必须重启gunicorn进程才能加载新代码,这是Python WSGI服务的通用运行逻辑,和PHP、带watcher的Node.js部署模式有本质区别。
你当前的wsgi.py是标准写法,无需调整。
开发环境自动重载方案
本地调试阶段可以通过配置gunicorn的重载参数实现代码修改自动生效:
- 找到你的
gunicorn.servicesystemd配置文件,在启动命令(ExecStart行)的末尾添加--reload参数,示例如下:
# 注意替换成你自己的虚拟环境路径、套接字路径等配置 ExecStart=/opt/your_project/venv/bin/gunicorn --workers 2 --bind unix:/opt/your_project/gunicorn.sock wsgi:application --reload
- 保存配置后依次执行以下命令生效:
systemctl daemon-reloadsystemctl restart gunicorn
后续修改代码后gunicorn会自动检测到变更、重启worker进程,不需要你手动执行重启命令。
如果是纯本地开发,也可以直接运行Flask自带的调试服务器,默认就开启自动重载,还带断点调试功能,开发效率更高,注意这个调试服务器仅可用于本地开发,绝对不能用于生产环境。
生产环境注意事项
生产环境禁止开启--reload参数,该功能存在性能损耗和稳定性风险,生产环境修改代码后手动执行systemctl restart gunicorn是标准操作。如果需要不中断业务的重启,可以执行systemctl reload gunicorn,gunicorn会启动新的worker进程加载新代码处理请求,再逐步杀掉旧的worker进程,不会影响线上业务运行。
如果你的应用包含启动时仅执行一次的初始化逻辑,要注意保证这部分逻辑的幂等性,避免重启/重载时出现异常。
内容的提问来源于stack exchange,提问作者Karthikeyan Ganesan
相关产品推荐
相关产品推荐

