web-dev-qa-db-fra.com

Plusieurs applications mod_wsgi sur un hôte virtuel redirigeant vers une mauvaise application

J'essaie d'obtenir deux (ou plus) Django applications installées dans des sous-répertoires du même domaine, par exemple:

http://example.com/site1/
http://example.com/site2/

Je sais que cela fonctionne normalement en configurant un hôte virtuel Apache comme ceci:

<VirtualHost *:80>
    ...
    WSGIScriptAlias /site1 /path/to/site1.wsgi
    WSGIScriptAlias /site2 /path/to/site2.wsgi
</VirtualHost>

Maintenant, j'ai vérifié que chaque site fonctionne individuellement. Mais lorsque j'essaie d'exécuter les deux côte à côte, Apache m'envoie sur le site que le processus de travail a chargé en premier. Exemple:

  1. Redémarrez Apache configuré pour servir 6 threads
  2. Chargez example.com/site1/, obtenez la bonne page
  3. Chargez example.com/site2/, obtenez la bonne page
  4. Répétez 2 et 3 2 fois de plus.
  5. Actualisez example.com/site1/ à plusieurs reprises, regardez-le passer d'un site à l'autre.

En effet, pour un nombre donné de processus de travail, il parcourt le nombre total d'entre eux envoyant la demande à celui qu'il a atteint en premier, quelle que soit la directive WSGIScriptAlias. Peu importe ce que je fais (définition de WSGIProcessGroup, du mode démon par rapport au mode intégré ou des directives), il continue de présenter ce comportement.

Si quelqu'un peut signaler ce que je fais mal ici, ce serait phénoménal!

44
Gabriel Hurley

J'ai eu plusieurs applications WSGI exécutées sur une seule installation Apache, et j'ai constaté que la chose la plus simple à faire est simplement d'avoir plusieurs groupes de processus, un pour chacune des applications.

Un inconvénient, par rapport à essayer d'obtenir un seul processus pour exécuter les deux (ou plus) applications, est que cela pourrait utiliser un peu plus de mémoire résidente que vous ne pourriez en tirer autrement. Mais cela les maintient assez bien séparés et évite les tracas. Et cela pourrait ne pas vous préoccuper (ce n'était pas pour moi).

(Ce n'est peut-être pas si mal non plus, ils pourraient être en mesure de partager beaucoup de pages de texte?

Voici quelques extraits de mon httpd.conf, approximativement:

WSGIDaemonProcess khdx_wsgi user=galdosd group=galdosd maximum-requests=10000
WSGIScriptAlias /khdx /home/galdosd/khdxweb/rel/khdx/Apache/Django.wsgi
<Location /khdx>
WSGIProcessGroup khdx_wsgi
</Location>

WSGIDaemonProcess sauron_wsgi user=galdosd group=galdosd maximum-requests=10000
WSGIScriptAlias /sauron /home/galdosd/finalsauronweb/Django-root/Apache/Django.wsgi
<Location /sauron>
WSGIProcessGroup sauron_wsgi
</Location>
54
Domingo Ignacio

La réponse de Domingo Ignacio m'a mis sur la bonne voie. Je voudrais souligner un fait important pour le faire fonctionner: les deux groupes de processus doivent être dans le même VirtualHost. (Ceci est basé sur mes tests avec Ubuntu 12.04.3 LTS, Apache 2.2.22 et quelques applications WSGI écrites en Python.)

Par exemple, cela n'a pas fonctionné pour moi, ce qui a permis d'accéder à app1 mais une erreur 404 pour app2:

<VirtualHost *>
        WSGIDaemonProcess app1 user=someuser group=somegroup threads=5
        WSGIScriptAlias /app1 /app1/app1.wsgi

        <Location /app1>
                WSGIProcessGroup app1
        </Location>
</VirtualHost>

<VirtualHost *>
        WSGIDaemonProcess app2 user=someuser group=somegroup threads=5
        WSGIScriptAlias /app2 /app2/app2.wsgi

        <Location /app2>
                WSGIProcessGroup app2
        </Location>
</VirtualHost>

La suppression du milieu et des balises, afin d'avoir un seul VirtualHost, a résolu le problème:

<VirtualHost *>
        WSGIDaemonProcess app1 user=someuser group=somegroup threads=5
        WSGIScriptAlias /app1 /app1/app1.wsgi

        <Location /app1>
                WSGIProcessGroup app1
        </Location>

        WSGIDaemonProcess app2 user=someuser group=somegroup threads=5
        WSGIScriptAlias /app2 /app2/app2.wsgi

        <Location /app2>
                WSGIProcessGroup app2
        </Location>
</VirtualHost>
13
Steve Saporta

J'ai moi-même eu des problèmes avec ça. Au lieu d'essayer d'obtenir la bonne configuration Apache, j'ai décidé à la place d'utiliser un seul WSGIScriptAlias ​​et d'avoir un middleware WSGI qui achemine les demandes vers les applications correctes. Mon code est à https://github.com/zhemao/flotilla . Je ne l'ai pas beaucoup testé, alors utilisez-le avec prudence, mais j'espère que cela vous aidera.

1
Zhehao Mao