Apache部署Python Bottle WSGI时模块修改不生效求助
解决Apache下Bottle应用修改子模块后不生效的问题
我之前在部署Bottle应用到Apache时也碰到过完全一样的情况——改了dbmanager.py之后死活不生效,必须手动touch app.wsgi或者重启Apache才行。这其实是mod_wsgi的模块缓存机制导致的:WSGI进程启动时会一次性加载所有导入的Python模块并缓存起来,后续修改子模块文件时,它不会主动去重新读取这些文件,除非触发主WSGI文件的重载逻辑。
下面给你几个实用的解决方案,分开发和生产环境两种场景:
开发环境:启用Bottle自动重载(最省心)
如果是在开发阶段,完全可以让Bottle自己处理重载。修改你的app.wsgi文件,加入自动重载的逻辑:
import os, sys from os.path import dirname sys.path.append(dirname(__file__)) import bottle # 只在开发环境开启自动重载 if os.getenv('DEVELOPMENT') == '1': # 开启调试模式和自动重载 bottle.debug(True) bottle.run(reloader=True, host='0.0.0.0', port=8000) else: # 生产环境的WSGI应用入口 application = bottle.default_app()
开发时你可以直接运行这个脚本(而不是通过Apache),或者在Apache的环境变量里设置DEVELOPMENT=1,这样每次修改dbmanager.py,Bottle都会自动重启应用,不用再手动touch文件了。
生产/测试环境:配置mod_wsgi自动重载
如果必须跑在Apache下,mod_wsgi本身提供了自动重载的配置。你可以在Apache的虚拟主机配置文件里添加这些指令:
# 指定WSGI脚本的进程组 WSGIImportScript /var/www/paka/public_html/edi/api/app.wsgi process-group=paka-api application-group=%{GLOBAL} WSGProcessGroup paka-api # 开启自动重载监控 WSGIAutoReload On
WSGIAutoReload On会让mod_wsgi监控所有已加载模块的修改时间,一旦文件有变化就自动重启对应的WSGI进程。- 注意:生产环境开启这个要谨慎,频繁的代码修改可能导致进程频繁重启,影响服务稳定性。
备选方案:用脚本自动触发重载
如果上面的配置都不生效,还可以用inotifywait写个简单的监控脚本,自动在dbmanager.py修改时touchapp.wsgi:
#!/bin/bash # 监控dbmanager.py的修改事件 inotifywait -m -e modify /var/www/paka/public_html/edi/api/dbmanager.py | while read _ _ _; do echo "Detected dbmanager.py change, reloading app.wsgi..." touch /var/www/paka/public_html/edi/api/app.wsgi done
把这个脚本保存为reload-trigger.sh,给它加执行权限(chmod +x reload-trigger.sh),然后后台运行(./reload-trigger.sh &),这样每次改完dbmanager.py就自动触发重载了,不用手动敲命令。
额外提醒
- 生产环境尽量不要依赖自动重载,建议用版本控制+滚动部署的方式更新代码,避免服务中断。
- 检查一下mod_wsgi的版本,某些旧版本对自动重载的支持有bug,升级到最新稳定版可能能解决问题。
内容的提问来源于stack exchange,提问作者user3345547
相关产品推荐
相关产品推荐

