mod_wsgi 强制重新加载模块

15 投票
4 回答
11669 浏览
提问于 2025-04-15 11:10

有没有办法让mod_wsgi在每次加载时重新加载所有模块(可能是在某个特定的目录下)?

在编写代码的时候,每次修改后都要重启apache,真是太麻烦了。我目前找到的唯一办法是在每个导入语句下面加上modname = reload(modname),但这也很烦人,因为以后还得把这些代码都去掉……

4 个回答

12

下面的解决方案仅适用于Linux用户,并且已经在Ubuntu Server 12.04.1上测试过。

要在守护进程模式下运行WSGI,你需要在Apache的配置文件中指定WSGIProcessGroupWSGIDaemonProcess这两个指令,比如:

WSGIProcessGroup my_wsgi_process
WSGIDaemonProcess my_wsgi_process threads=15

更多详细信息可以在这个链接找到:http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives

一个额外的好处是,如果你在同一台服务器上运行多个WSGI网站,使用守护进程可以提高稳定性,可能还会用到虚拟主机指令。如果不使用守护进程,我发现两个Django网站会互相冲突,导致交替出现500内部服务器错误。

此时,你的服务器实际上已经在监控你的WSGI网站的变化,尽管它只监视你通过WSGIScriptAlias指定的文件,比如:

WSGIScriptAlias / /var/www/my_django_site/my_django_site/wsgi.py

这意味着你可以通过更改WSGI脚本来强制重新加载WSGI守护进程。当然,你不需要改变脚本的内容,而是可以简单地:

$ touch /var/www/my_django_site/my_django_site/wsgi.py

这样就可以了。

通过使用上述方法,你可以在生产环境中自动重新加载WSGI网站,而无需重启或重新加载整个Apache服务器,也不需要修改你的WSGI脚本来进行不安全的代码变更监控。

这在你有自动部署脚本时特别有用,因为你不想在部署时重启Apache服务器。

在开发过程中,你可以使用文件系统变化监视器,每当你的网站下的模块发生变化时,就调用touch wsgi.py,例如,pywatch

14

这个链接:

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

是非常重要的。还要特别强调,在UNIX系统上,使用mod_wsgi时必须选择守护进程模式,并且你需要按照文档中的说明实现代码监控器。整个代码重载的过程在UNIX系统的嵌入模式下是无法使用的。虽然在Windows系统上唯一的选择是嵌入模式,但通过一些小技巧,可以通过代码监控脚本触发Apache的内部重启,达到类似的效果。这一点在文档中也有说明。

5

关于代码重新加载,最好的参考资料就是mod_wsgi的官方文档

撰写回答