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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:17:37