2012-08-26 10 views
12

Actualmente estoy usando dos aplicaciones de Django (digamos A & B) alojadas en el mismo dominio (pero se sirven en diferentes puertos) a través de Apache. Creo que mi configuración es correcta, pero estoy obteniendo al azar 500 en ambos sitios. El 500 en A (por ejemplo, decir) se produce principalmente después de que se haya notificado una solicitud en B (y viceversa).Varios sitios usando Django y mod_wsgi en Apache

Al inspeccionar el registro de errores (de, digamos, por ejemplo A), veo que A 'módulo wsgi s está intentando acceder a B' s settings.py archivo (que obviamente no sucede a estar allí, ya que las rutas de proyecto son diferente) [y esto sucede a la inversa, el wsgi de B plantea una excepción que se queja de la falta del archivo settings.py de A]. No estoy seguro de por qué buscarían el otro archivo de configuración, las importaciones (para settings.py) en todas las vistas son específicas para los proyectos respectivos.

Aquí está mi configuración:

A se está sirviendo en el puerto 8080, B se está sirviendo en el puerto 80.

VirtualHost:

<VirtualHost *:8080> 

    ServerAdmin [email protected] 
    ServerName string1 

    Alias /static/ /home/PATH_TO_PROJECT_A/static/ 

    <Directory /home/PATH_TO_PROJECT_A/static> 
    Order deny,allow 
    Allow from all 
    </Directory> 

    WSGIScriptAlias//home/PATH_TO_PROJECT_A/wsgi.py 

    <Directory /home/PATH_TO_PROJECT_A> 
    <Files wsgi.py> 
    Order deny,allow 
    Allow from all 
    </Files> 
    </Directory> 


    LogLevel warn 
    ErrorLog /SOME_PATH/errorA.log 
    CustomLog /SOME_PATH/accessA.log combined 
</VirtualHost> 


<VirtualHost *:80> 
    ServerName string1 
    ServerAdmin [email protected] 

    Alias /APP_B/static/ /home/PATH_TO_PROJECT_B/static/ 

    <Directory /home/PATH_TO_PROJECT_B/static> 
    Order deny,allow 
    Allow from all 
    </Directory> 

    WSGIScriptAlias /APP_B /home/PATH_TO_PROJECT_B/wsgi.py/ 

    <Directory /home/PATH_TO_PROJECT_B> 
    <Files wsgi.py> 
    Order deny,allow 
    Allow from all 
    </Files> 
    </Directory> 

    ErrorLog /home/SOME_PATH/error2.log 
    CustomLog /home/SOME_PATH/access2.log combined 

    # All other files on B:80 (other than /APP_B are served normally 
    DocumentRoot /home/foo/public_html/xyz/public 

</VirtualHost> 

ports.conf:

NameVirtualHost *:8080 
Listen 8080 
Listen 80 

<IfModule mod_ssl.c> 
Listen 443 
</IfModule> 

<IfModule mod_gnutls.c> 
Listen 443 
</IfModule> 

wsgi.py en 'A':

import os, sys 

sys.path.append('home/PATH_TO_PROJECT_A') #1 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PROJECT_A.settings") #2 

from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

Y exactamente igual en B, con los cambios en la línea # 1 y # 2.

error que recibo de la error.log decir por ejemplo de A:

[Sun Aug 26 17:01:49 2012] [error] [client x] Traceback (most recent call last): 
[Sun Aug 26 17:01:49 2012] [error] [client x] File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 219, in __call__ 
[Sun Aug 26 17:01:49 2012] [error] [client x]  self.load_middleware() 
[Sun Aug 26 17:01:49 2012] [error] [client x] File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 39, in load_middleware 
[Sun Aug 26 17:01:49 2012] [error] [client x]  for middleware_path in settings.MIDDLEWARE_CLASSES: 
[Sun Aug 26 17:01:49 2012] [error] [client x] File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 184, in inner 
[Sun Aug 26 17:01:49 2012] [error] [client x]  self._setup() 
[Sun Aug 26 17:01:49 2012] [error] [client x] File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 42, in _setup 
[Sun Aug 26 17:01:49 2012] [error] [client x]  self._wrapped = Settings(settings_module) 
[Sun Aug 26 17:01:49 2012] [error] [client x] File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 95, in __init__ 
[Sun Aug 26 17:01:49 2012] [error] [client x]  raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)) 
[Sun Aug 26 17:01:49 2012] [error] [client x] ImportError: Could not import settings 'PROJECT_B.settings' (Is it on sys.path?): No module named PROJECT_B.settings 

Como se puede ver A 's registro de errores se queja de que B' s settings.py no se encuentra. Por favor, arroja algo de luz, no tengo idea de qué pasa. No veo por qué una aplicación buscaría el archivo settings.py del otro para importar?

Ambas aplicaciones funcionan y se ejecutan como se esperaba, pero se rompen en solicitudes aleatorias que atienden al 500 (que se borra si actualizo de nuevo).

¡Gracias!

Respuesta

15

Django rompe el wsgi.py generado para ejecutar múltiples instancias de Django en el mismo proceso en diferentes subinterpretadores. De cualquier modo demonio uso mod_wsgi y delegar cada uno a un grupo de procesos demonio separado, es mejor de todos modos, o cambiar:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PROJECT_A.settings") 

a:

os.environ["DJANGO_SETTINGS_MODULE"] = "PROJECT_A.settings" 

Del mismo modo para otro archivo wsgi.py.

+2

Por cierto, esta otra [pregunta] (http://stackoverflow.com/questions/9581197/two-django-projects-running-simultaneously-and-mod-wsgi-acting-werid) presenta un ejemplo práctico de Graham mismo de usar grupos de procesos daemon separados. Me ayudó mucho, ¡obtuviste mis votos, Graham! –

+0

todavía no funcionará para mí. ¿Puedes decirme porque?todavía 404 página – user2771714

+0

No asuma que tiene el mismo problema y no espere que las personas sean lectores mentales. Crea una pregunta separada y detalla exactamente cuál es tu problema. –

Cuestiones relacionadas