2009-04-20 4 views
10

Existe-t-il un moyen pour mod_wsgi de recharger tous les modules (peut-être dans un répertoire particulier) sur chaque chargement? En travaillant sur le code, il est très ennuyeux de redémarrer Apache à chaque fois que quelque chose est changé. La seule option que j'ai trouvé jusqu'à maintenant est de mettre modname = reload(modname) en dessous de chaque importation .. mais c'est aussi très ennuyeux car cela signifie que je vais devoir passer et les supprimer tous à une date ultérieure ..mod_wsgi modules de rechargement de force

Répondre

5

mod_wsgi documentation on code reloading est votre meilleur pari pour une réponse.

+2

Je lisais que .. n'a pas été utile cependant :( – Ian

+0

Ian, est-ce parce que vous êtes sur Windows ou en utilisant mod_wsgi en mode intégré? Parce que sinon cette page a du code pour le redémarrage automatique et cela fonctionne parfaitement. –

+0

Non, c'est sur Linux. Le rechargement automatique ne s'applique qu'au script en cours d'accès, pas aux modules appelés par le script. – Ian

11

Le lien:

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

doit être souligné. Il faut également souligner que sur les systèmes UNIX, le mode daemon de mod_wsgi doit être utilisé et que vous devez implémenter le moniteur de code décrit dans la documentation. L'option de rechargement de processus ne fonctionnera pas pour le mode intégré de mod_wsgi sur les systèmes UNIX. Même si sur les systèmes Windows la seule option est le mode embarqué, il est possible de faire la même chose en provoquant un redémarrage interne d'Apache à partir du script de contrôle de code. Ceci est également décrit dans la documentation.

9

La solution suivante est destiné aux utilisateurs Linux uniquement, et a été testé pour fonctionner sous Ubuntu Server 12.04.1

Pour exécuter WSGI en mode démon, vous devez spécifier WSGIProcessGroup et WSGIDaemonProcess directives dans votre fichier de configuration Apache , par exemple

WSGIProcessGroup my_wsgi_process 
WSGIDaemonProcess my_wsgi_process threads=15 

Plus de détails sont disponibles dans http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives

Une prime ajoutée est la stabilité supplémentaire si vous utilisez plusieurs sites WSGI sous le sam e serveur, potentiellement avec des directives VirtualHost. Sans utiliser les processus démon, j'ai trouvé deux sites Django en conflit les uns avec les autres et en retournant 500 erreurs internes du serveur en alternance.

À ce stade, votre serveur est en fait la surveillance déjà votre site WSGI pour les changements, mais il regarde uniquement le fichier spécifié à l'aide WSGIScriptAlias, comme

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

Cela signifie que vous pouvez forcer le processus démon WSGI recharger en changeant le script WSGI. Bien sûr, vous n'avez pas à modifier son contenu, mais plutôt

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

ferait l'affaire. En utilisant la méthode ci-dessus, vous pouvez recharger automatiquement un site WSGI dans un environnement de production sans redémarrer/recharger tout le serveur Apache ou en modifiant votre script WSGI pour effectuer une surveillance de modification de code non sécurisée pour la production. Ceci est particulièrement utile lorsque vous avez des scripts de déploiement automatisés et que vous ne voulez pas redémarrer le serveur Apache lors du déploiement.

Au cours du développement, vous pouvez utiliser un système de fichiers change Watcher pour appeler touch wsgi.py chaque fois qu'un module sous vos modifications du site, par exemple, pywatch

2

Je sais qu'il est un vieux fil, mais cela pourrait aider quelqu'un.Pour tuer votre processus quand un fichier dans un répertoire est écrit, vous pouvez utiliser quelque chose comme ceci:

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

Dans votre démarrage du serveur, appelez comme:

serveur .py

import monitor 

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

si votre fichier principal du serveur est dans le répertoire qui contient tous vos fichiers, vous pouvez aller comme:

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

Ajout d'autres dossiers est laissé comme un exercice ...

Vous devez Pip installer inotify '

Cela a été cribbed du code ici: https://code.google.com/archive/p/modwsgi/wikis/ReloadingSourceCode.wiki#Restarting_Daemon_Processes

C'est un répondre à ma question en double ici: WSGI process reload modules