mod_wsgi强制重装模块

时间:2009-04-20 02:04:53

标签: python module mod-wsgi reload

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

在处理代码时,每次更改内容时重启apache都会非常烦人。到目前为止,我发现的唯一选择是将modname = reload(modname)置于每次导入之下..但这也很烦人,因为这意味着我将不得不在以后将其全部删除。< / p>

4 个答案:

答案 0 :(得分:12)

链接:

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

应该强调。还应该强调,在UNIX系统上必须使用mod_wsgi的守护进程模式,并且必须实现文档中描述的代码监视器。对于UNIX系统上的mod_wsgi的嵌入模式,整个进程重新加载选项不起作用。尽管在Windows系统上唯一的选择是嵌入式模式,但通过从代码监视脚本触发Apache的内部重启,可以通过一些技巧来做同样的事情。这也在文档中描述。

答案 1 :(得分:9)

以下解决方案仅针对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站点(可能使用VirtualHost指令),则额外的稳定性是额外的稳定性。在不使用守护进程的情况下,我发现两个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

答案 2 :(得分:5)

mod_wsgi documentation on code reloading是您回答的最佳选择。

答案 3 :(得分:2)

我知道它是一个旧线程,但这可能对某人有所帮助。要在写入某个目录中的任何文件时终止进程,可以使用以下内容:

monitor.py

user_id = 42
obj = User.objects.filter(id=user_id).first()
if not obj:
    raise Exception("Invalid user id given")

在您的服务器启动中,将其命名为:

server.py

import os, sys, time, signal, threading, atexit
import inotify.adapters

def _monitor(path):

    i = inotify.adapters.InotifyTree(path)

    print "monitoring", path
    while 1:
        for event in i.event_gen():
            if event is not None:
                (header, type_names, watch_path, filename) = event
                if 'IN_CLOSE_WRITE' in type_names:
                    prefix = 'monitor (pid=%d):' % os.getpid()
                    print "%s %s/%s changed," % (prefix, path, filename), 'restarting!'
                    os.kill(os.getpid(), signal.SIGKILL)

def start(path):

    t = threading.Thread(target = _monitor, args = (path,))
    t.setDaemon(True)
    t.start()

    print 'Started change monitor. (pid=%d)' % os.getpid()

如果您的主服务器文件位于包含所有文件的目录中,您可以这样:

import monitor

monitor.start(<directory which contains your wsgi files>)

添加其他文件夹作为练习......

您需要安装inotify&#39;

这是来自这里的代码:https://code.google.com/archive/p/modwsgi/wikis/ReloadingSourceCode.wiki#Restarting_Daemon_Processes

这是我在此重复提问的答案:WSGI process reload modules