2009-04-20 13 views
10

¿Hay alguna manera de que mod_wsgi recargue todos los módulos (tal vez en un directorio particular) en cada carga?mod_wsgi force reload modules

Mientras trabajas en el código, es muy molesto reiniciar apache cada vez que se cambia algo. La única opción que he encontrado hasta ahora es poner modname = reload(modname) debajo de cada importación ... pero eso también es realmente molesto ya que significa que voy a tener que pasar y eliminarlos todos en una fecha posterior ...

Respuesta

5

The mod_wsgi documentation on code reloading es su mejor apuesta para obtener una respuesta.

+2

Estaba leyendo eso ... pero no fue tan útil :( – Ian

+0

Ian, ¿esto es porque estás en Windows o usando mod_wsgi en modo incrustado? Porque de lo contrario, esa página tiene algún código para el reinicio automático y funciona perfectamente. –

+0

No, esto es en Linux. La recarga automática solo se aplica a la secuencia de comandos a la que se accede, no a los módulos a los que llama la secuencia de comandos. – Ian

11

El enlace:

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

Debe enfatizarse. También se debe enfatizar que en los sistemas UNIX se debe usar el modo daemon de mod_wsgi y debe implementar el monitor de código descrito en la documentación. La opción de recarga de todo el proceso no funcionará para el modo integrado de mod_wsgi en sistemas UNIX. Aunque en los sistemas Windows la única opción es el modo incrustado, es posible hacer algo similar mediante un truco de engaño al desencadenar un reinicio interno de Apache desde el script de supervisión del código. Esto también se describe en la documentación.

9

La siguiente solución está dirigida a los usuarios de Linux solamente, y ha sido probado para trabajar bajo servidor de Ubuntu 12.04.1

Para ejecutar WSGI en modo daemon, es necesario especificar WSGIProcessGroup y WSGIDaemonProcess directivas en el archivo de configuración de Apache , por ejemplo

WSGIProcessGroup my_wsgi_process 
WSGIDaemonProcess my_wsgi_process threads=15 

Más detalles están disponibles en http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives

Una ventaja adicional es la estabilidad adicional si está ejecutando varios sitios WSGI bajo el sam e servidor, potencialmente con directivas VirtualHost. Sin usar procesos de daemon, encontré dos sitios de Django en conflicto entre sí y apareciendo 500 Internal Server Error alternativamente.

En este punto, el servidor es de hecho ya la supervisión de su sitio WSGI para los cambios, a pesar de que sólo se ve el archivo que especifica usando WSGIScriptAlias, como

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

Esto significa que se puede forzar el proceso demonio WSGI para volver a cargar cambiando la secuencia de comandos WSGI. Por supuesto, usted no tiene que cambiar su contenido, sino más bien,

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

haría el truco.

Al utilizar el método anterior, puede volver a cargar automáticamente un sitio WSGI en el entorno de producción sin reiniciar/recargar todo el servidor Apache o modificar su secuencia de comandos WSGI para realizar una supervisión de cambio de código no segura.

Esto es particularmente útil cuando tiene scripts de implementación automatizados y no desea reiniciar el servidor Apache en la implementación.

Durante el desarrollo, es posible utilizar un sistema de archivos cambios vigilante para invocar touch wsgi.py cada vez que un módulo bajo los cambios en el sitio, por ejemplo, pywatch

2

Sé que es un hilo viejo, pero esto podría ayudar a alguien.Para matar el proceso cuando cualquier archivo en un directorio determinado se escribe, se puede usar algo como esto:

monitor.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() 

En el inicio del servidor, lo llaman como:

servidor .PY

import monitor 

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

si el archivo del servidor principal está en el directorio que contiene todos sus archivos, puede ir como:

monitor.start(os.path.dirname(__file__)) 

Adición de otras carpetas se deja como ejercicio ...

Tendrá que 'PIP instalar inotify'

Esto fue cribbed desde el código aquí: https://code.google.com/archive/p/modwsgi/wikis/ReloadingSourceCode.wiki#Restarting_Daemon_Processes

Ésta es una responda a mi pregunta duplicada aquí: WSGI process reload modules