mod_wsgi fuerza recargar módulos

¿Hay alguna forma de que mod_wsgi vuelva a cargar todos los módulos (tal vez en un directorio en particular) en cada carga?

Mientras se trabaja 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 tendré que revisarlos y eliminarlos en una fecha posterior.

La documentación de mod_wsgi sobre la recarga de códigos es su mejor apuesta para una respuesta.

El enlace:

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

debe ser enfatizado También se debe enfatizar que en los sistemas UNIX se debe usar el modo daemon de mod_wsgi y se 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 integrado, es posible, mediante un poco de trucos, hacer lo mismo al iniciar un reinicio interno de Apache desde el script de monitoreo de código. Esto también se describe en la documentación.

La siguiente solución está dirigida solo a usuarios de Linux y se ha probado que funciona bajo Ubuntu Server 12.04.1

Para ejecutar WSGI en modo daemon, debe especificar las directivas WSGIProcessGroup y WSGIDaemonProcess en su 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 en el mismo servidor, potencialmente con las directivas de VirtualHost. Sin utilizar procesos de daemon, encontré dos sitios de Django en conflicto entre sí y, alternativamente, encontré 500 errores internos del servidor.

En este punto, su servidor de hecho ya está monitoreando los cambios en su sitio WSGI, aunque solo observa el archivo que especificó usando WSGIScriptAlias , como

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

Esto significa que puede forzar la recarga del proceso del demonio WSGI cambiando el script WSGI. Por supuesto, no tienes 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 recargar 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 un monitoreo de cambios de código inseguro en la producción.

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, puede usar un observador de cambios del sistema de archivos para invocar touch wsgi.py cada vez que touch wsgi.py un módulo en su sitio, por ejemplo, pywatch

Sé que es un hilo viejo, pero esto podría ayudar a alguien. Para finalizar el proceso cuando se escribe un archivo en un directorio determinado, 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 de su servidor, llámelo como:

server.py

 import monitor monitor.start() 

Si el archivo de su servidor principal está en el directorio que contiene todos sus archivos, puede ir como:

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

Agregar otras carpetas se deja como ejercicio …

Tendrá que ‘pip instalar inotify’

Esto se obtuvo del código aquí: https://code.google.com/archive/p/modwsgi/wikis/ReloadingSourceCode.wiki#Restarting_Daemon_Processes

Esta es una respuesta a mi pregunta duplicada aquí: los módulos de recarga del proceso WSGI