2012-03-06 12 views
11

Estoy tratando de ejecutar dos proyectos de Django simultáneamente. Yo estaba usando mod_wsgi, y descubrí que el sitio está actuando de forma extraña. Tal vez habría una solución alternativa, pero me gustaría saber qué es lo que me falta y cómo resolver el problema.Dos proyectos de Django ejecutándose simultáneamente y mod_wsgi actuando werid

En la configuración de Apache

# Setup the Python environment 
# As root owns basically everything on a Amazon AMI and root 
# cannot be used. Create a folder under /var/run/wsgi 
# with the owner as ec2-user and group ec2-user. 
WSGISocketPrefix /var/run/wsgi 
# Call your daemon process a name 
WSGIDaemonProcess pydaemon processes=1 threads=5 
# Call your daemon process group a name 
WSGIProcessGroup pydaemon 
# Point to where the handler file is. This will be different 
# If you are using some other framework. 
WSGIScriptAlias /test /var/www/html/test/wsgi.py 
WSGIScriptAlias /proto /var/www/html/proto/wsgi.py 

Después de Apache reinicia, si conecto a '/ proto', entonces el sitio proto se muestra. Sin embargo, luego me conecto a '/ test', sin reiniciar Apache, el sitio proto aún se muestra y no puedo acceder al sitio de prueba.

Ahora reinicio Apache, esta vez voy a '/ test' primero. ¡El sitio de prueba aparece! Sin embargo, si voy a '/ proto' todavía muestra el sitio de prueba, no el sitio de proto.

¿Qué podría hacer que esto suceda? Agregué SESSION_COOKIE_PATH de manera diferente para cada aplicación por si acaso, pero el problema aún existe.


[ACTUALIZADO]

También probé como el siguiente, para dar diferentes nombres de grupos de aplicaciones WSGI, pero sin suerte.

Alias /cuedit /var/local/test/wsgi.py 
<Location /test> 
SetHandler wsgi-script 
Options +ExecCGI 
WSGIApplicationGroup test 
</Location> 
Alias /proto /var/local/proto/wsgi.py 
<Location /proto> 
SetHandler wsgi-script 
Options +ExecCGI 
WSGIApplicationGroup proto 
</Location> 

[ACTUALIZADO]

I cambió desde el modo demonio al modo incrustado. Supongo que el problema fue que dos instancias compartieron el mismo proceso de demonio mod_wsgi por lo que su espacio de nombres colisionó.

Supongo que deberían manejarse correctamente, pero en el modo daemon no pude hacerlo bien.

+0

No coloque su código bajo '/ var/www/html'. –

+0

Y en cada caso no encontré errores en el registro de errores de Apache, mientras que el registro de acceso muestra HTTP GET en cada directorio correctamente – MHC

+0

@DanielRoseman ¿Quiere colocar directorios externos en HTML? – MHC

Respuesta

14

utilizar esto como una solución:

WSGIDaemonProcess pydaemon-1 processes=1 threads=5 
WSGIDaemonProcess pydaemon-2 processes=1 threads=5 

WSGIScriptAlias /test /var/www/html/test/wsgi.py 

<Location /test> 
WSGIProcessGroup pydaemon-1 
WSGIApplicationGroup %{GLOBAL} 
</Location> 

WSGIScriptAlias /proto /var/www/html/proto/wsgi.py 

<Location /proto> 
WSGIProcessGroup pydaemon-2 
WSGIApplicationGroup %{GLOBAL} 
</Location> 

Esto forzará a cada aplicación a un grupo de procesos de daemon por separado y no habrá manera de que puedan interferir entre sí.

Si eso todavía no funciona, tiene problemas con su archivo de script WSGI de alguna manera.

+0

Exactamente lo que esperaba poder hacer. Muchas gracias! – MHC

+0

Aunque es una solución. Lo que tenía que funcionar debería funcionar a menos que WSGIApplicationGroup estuviera siendo reemplazado de una manera que forzara el uso de un solo intérprete. –

1

El problema podría estar relacionado con que Apache comparta el subinterpretador Python entre las aplicaciones WSGI. Trate de añadir esto a la configuración de Apache para evitar compartir:

WSGIApplicationGroup %{GLOBAL} 

Comprobar this blog post para la explicación en profundidad y consejos adicionales (verifique en los comentarios también).

+1

Definitivamente no quiere esto. Esto los obligará a correr de la misma manera, no por separado. El valor predeterminado debe ser 'WSGIApplicationGroup% {RESOURCE}', que los mantiene separados. La publicación del blog sugiere esto para resolver un tipo diferente de problema. –

+0

Supongo que la solución de @Lycha también podría estar relacionada, porque aunque% {GLOBAL} les obliga a ejecutar de la misma manera, prohíbe el uso de un intérprete, y si el problema estaba en el intérprete, podría haber resuelto el problema. Lamentablemente,% {GLOBAL} no resolvió el problema. – MHC

+0

@GrahamDumpleton Ni% {GLOBAL} ni% {RESOURCE} (predeterminado) resolvió el problema, ¡pero gracias a los dos por los comentarios! Me ayudaste a aprender un poco más sobre mod_wsgi. – MHC

4

También tengo 2 proyectos Django sin embargo, cada uno se está ejecutando en un puerto diferente (httpd config), se ve algo como esto:

<VirtualHost *:80> 
    ServerAdmin xx 
    ServerName xx 
    ServerAlias xx 
    ErrorLog /path/to/first/project/logs/error.log 
    CustomLog /path/to/first/project/logs/access.log combined 

    Alias /static/ /path/to/first/project/sitestatic 

    WSGIDaemonProcess app processes=1 threads=15 display-name=%{GROUP} 
    WSGIProcessGroup app 

    WSGIScriptAlias//path/to/first/project/django.wsgi 

    <Directory /path/to/first/project/apache> 
     Order deny,allow 
     Allow from all 
    </Directory> 
</VirtualHost> 

<VirtualHost *:8080> 
    ServerAdmin xx 
    ServerName xx 
    ServerAlias xx 
    ErrorLog /path/to/second/project/logs/error.log 
    CustomLog /path/to/second/project/logs/access.log combined 

    WSGIDaemonProcess app1 processes=1 threads=15 display-name=%{GROUP} 
    WSGIProcessGroup app1 

    WSGIScriptAlias//path/to/second/project/apache/django.wsgi 

    <Directory /path/to/second/project/apache> 
     Order deny,allow 
     Allow from all 
    </Directory> 
</VirtualHost> 
+0

Gracias por su respuesta. ¿Alguna idea de por qué ocurre el problema si no uso hosts virtuales? – MHC

+0

Esta es una respuesta subestimada. Funcionó PERFECTAMENTE para mis necesidades. –

0

No puedo comentar la respuesta dada por Graham, por lo que agrego una mía propia.

El problema para mí era realmente el intérprete de Python, pero también tuve que agregar el camino de python para cada intérprete.Aquí sigue una configuración de ejemplo:

WSGIDaemonProcess py_app1 processes=1 threads=5 python-path=/path/to/app1 
WSGIScriptAlias /app1 /path/to/app1/wsgi.py 
<Directory /path/to/app1> 
    <Files wsgi.py> 
     Order deny,allow 
     Allow from all 
    </Files> 
</Directory> 
<Location /app1> 
    WSGIProcessGroup py_app1 
    WSGIApplicationGroup %{GLOBAL} 
</Location> 

WSGIDaemonProcess py_app2 processes=1 threads=5 python-path=/path/to/app2 
WSGIScriptAlias /app2 /path/to/app2/wsgi.py 
<Directory /path/to/app2> 
    <Files wsgi.py> 
     Order deny,allow 
     Allow from all 
    </Files> 
</Directory> 
<Location /app2> 
    WSGIProcessGroup py_app2 
    WSGIApplicationGroup %{GLOBAL} 
</Location> 
Cuestiones relacionadas