Executando múltiplos projetos Django dentro do Apache, sys.path sendo escrito

2

Eu tenho tentado pesquisar como fazer uma implantação múltipla do Python / Django usando o Apache VirtualHosts.

A questão que estou encontrando parece direta,

ImportError: Could not import settings 'hub.settings' (Is it on sys.path?): No module named hub.settings, referer: proposals.internal.local

O problema que estou tendo é que proposal.internal.local está usando proposições.configurações e o hub.settings é, na verdade, de hub.internal.local.

Se eu executar apenas proposta ou hub por conta própria, não encontro o problema mencionado acima, no entanto, quando executo os dois - conforme as pessoas os usam. O sys.path parece estar atualizado para os dois projetos.

[APACHE CONFIGS - HUB]

<VirtualHost *:80>

    ServerName hub.internal.local

    DocumentRoot /var/www/hub.internal.local/hub/hub/static
    Alias /static/  /var/www/hub.internal.local/hub/hub/static/

    <Directory /var/www/hub.internal.local/hub/hub/static>

        Allow from all

    </Directory>

    WSGIScriptAlias / /var/www/hub.internal.local/hub/hub/wsgi.py

</VirtualHost>

[APACHE CONFIGS - PROPOSTAS]

<VirtualHost *:80>

    ServerName proposals.internal.local

    DocumentRoot /var/www/proposals.internal.local/proposal/proposal/static
    Alias /static/  /var/www/proposals.internal.local/proposal/proposal/static/

    <Directory /var/www/proposals.internal.local/proposal/proposal/static>

        Allow from all

    </Directory>

    WSGIScriptAlias / /var/www/proposals.internal.local/proposal/proposal/wsgi.py

</VirtualHost>

[wsgi.py - HUB]

import os
import sys

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hub.settings")
sys.path.append('/var/www/hub.internal.local')
sys.path.append('/var/www/hub.internal.local/hub')

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

[wsgi.py - PROPOSTAS]

import os
import sys

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proposal.settings")
sys.path.append('/var/www/proposals.internal.local')
sys.path.append('/var/www/proposals.internal.local/proposal')

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

É evidente que estou perdendo algo, mas não vejo nada incomum na documentação.

    
por Tim 11.01.2014 / 01:16

1 resposta

3

Não use os.environ.setdefault() . O Django estragou a hospedagem de vários aplicativos em um processo mod_wsgi quando eles mudaram para essa maneira de configurar variáveis de ambiente.

Isso está documentado em meu blog: Solicitações sendo executadas na instância errada do Django sob Apache / mod_wsgi.

There are two solutions if this is the cause. The quickest is to replace the use of setdefault() to set the environment variable in the WSGI script file with more usual assignment.

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

An alternative which involves a bit more work, but can have other benefits, is to switch to using daemon mode of mod_wsgi to run the Django instances and delegate each to a separate set of processes. By running the Django instances in separate processes there can be no possibility of environment variables leaking from one to the other.

WSGIDaemonProcess project-2
WSGIScriptAlias /suburl /some/path/project-2/wsgi.py process-group=project-2

WSGIDaemonProcess project-1
WSGIScriptAlias / /some/path/project-1/wsgi.py process-group=project-1
    
por 11.01.2014 / 10:10