python - produccion - Varias aplicaciones mod_wsgi en un host virtual que dirigen a la aplicación incorrecta
wsgi django (3)
Estoy intentando obtener dos (o más) aplicaciones de Django configuradas en subdirectorios bajo el mismo dominio, por ejemplo:
http://example.com/site1/
http://example.com/site2/
Sé que normalmente esto funciona bien al configurar un apache virtualhost como este:
<VirtualHost *:80>
...
WSGIScriptAlias /site1 /path/to/site1.wsgi
WSGIScriptAlias /site2 /path/to/site2.wsgi
</VirtualHost>
Ahora, he verificado que cada sitio funciona de forma individual. Pero cuando trato de ejecutar ambos uno al lado del otro, apache me envía al sitio que cargó primero el proceso de trabajo. Ejemplo:
- Reinicie Apache configurado para servir 6 hilos
- Cargue example.com/site1/, obtenga la página correcta
- Cargue example.com/site2/, obtenga la página correcta
- Repite 2 y 3 2 veces más.
- Actualice example.com/site1/ repetidamente, mire ciclo de un sitio a otro.
Efectivamente, para cualquier número dado de procesos de trabajo, se desplaza por el número total de ellos que envían la solicitud a la que golpeó primero, independientemente de la directiva WSGIScriptAlias. Independientemente de lo que haga (configuración de WSGIProcessGroup, modo daemon frente a modo incrustado o directivas), continúa mostrando este comportamiento.
Si alguien puede señalar lo que estoy haciendo mal aquí, ¡eso sería fenomenal!
He tenido problemas con esto yo mismo. En lugar de intentar obtener la configuración de Apache correcta, decidí utilizar WSGIScriptAlias y tener el middleware WSGI que enrutaba las solicitudes a las aplicaciones correctas. Mi código está en https://github.com/zhemao/flotilla . No lo he probado tanto, así que úselo con precaución, pero espero que ayude.
He tenido varias aplicaciones WSGI ejecutándose en una sola instalación Apache, y descubrí que lo más fácil es tener varios grupos de procesos, uno para cada una de las aplicaciones.
Una desventaja, en vez de intentar que un solo proceso ejecute ambas (o más) aplicaciones, es que esto podría usar un poco más de memoria residente de la que podría obtener si no fuera así. Pero los mantiene bastante bien separados y evita molestias. Y eso podría no ser una preocupación para ti (no fue para mí).
(¿No sería tan malo tampoco, podrían compartir muchas páginas de texto? Eso es solo una especulación ociosa, no he verificado esto de ninguna manera, ya que mi configuración no estaba para nada muerta de memoria)
Aquí hay algunos fragmentos de mi httpd.conf, aproximadamente:
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>
La respuesta de Domingo Ignacio me puso en el camino correcto. Me gustaría señalar un hecho importante sobre cómo hacer que funcione: los dos grupos de procesos deben estar dentro del mismo VirtualHost. (Esto se basa en mis pruebas con Ubuntu 12.04.3 LTS, Apache 2.2.22 y un par de aplicaciones WSGI escritas en Python).
Por ejemplo, esto no funcionó para mí, lo que resultó en la capacidad de acceder a la aplicación 1, pero a un error 404 para la aplicación2:
<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>
Quitar el medio y las etiquetas, para tener un solo VirtualHost, resolvió el problema:
<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>