2012-07-16 5 views
20

Ich möchte zwei verschiedene Django-Apps auf demselben Host bereitstellen: Die erste entspricht der URL/site1 und die zweite der URL/site2. Hier ist meine Konfiguration:Mehrere Django-Apps auf Apache mit mod_wsgi implementieren

 
LoadModule wsgi_module modules/mod_wsgi.so 

WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py 
WSGIScriptAlias /site2 /var/www/py/site2/site2/wsgi.py 

WSGIPythonPath /var/www/py/site1:/var/www/py/site2 

<Directory "/var/www/py/site1/site1"> 
<Files wsgi.py> 
Order deny,allow 
Allow from all 
</Files> 
</Directory> 

<Directory "/var/www/py/site2/site2"> 
<Files wsgi.py> 
Order deny,allow 
Allow from all 
</Files> 
</Directory> 

Auch hier ist die wsgi.py Datei für beide Anwendungen

 
import os 
import sys 

path = '/var/www/py/site1' 
if path not in sys.path: 
    sys.path.append(path) 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "site1.settings") 
from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

Nun, hier ist mein Problem. Wenn ich zu meinem Server gehe, sagen wir http://app1.sites.gr/site1 es lädt manchmal site1, und einige andere Male lädt es site2 !!!! Das gleiche gilt, wenn ich http://app1.sites.gr/site2 ... sometimes sehe Ich bekomme die Willkommensseite für site1, manchmal bekomme ich die Willkommensseite für site2! Ich treffe F5 und erhalte verschiedene Begrüßungsseiten. Ich habe alles in den letzten Stunden überprüft und nicht seltsam fündig geworden ...

Bitte, sagen Sie mir, was das Problem sein könnte, bevor ich verrückt ...

Dank!

Antwort

41

Dies ist ein Problem mit der wsgi.py Datei von Django 1.4 erzeugt zu erstellen. Es wird nicht funktionieren, wenn Sie versuchen, zwei verschiedene Django-Instanzen in demselben Prozess zu hosten, auch wenn dies in separaten Sub-Interpretern geschieht.

Wechsel:

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

zu:

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

Oder noch besser Daemon-Modus verwenden und jeden delegiert in verschiedenen Daemon Prozessgruppen laufen.

Das heißt, statt:

WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py 
WSGIScriptAlias /site2 /var/www/py/site2/site2/wsgi.py 

WSGIPythonPath /var/www/py/site1:/var/www/py/site2 

Verwendung:

WSGIDaemonProcess site1 python-path=/var/www/py/site1 
WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py process-group=site1 application-group=%{GLOBAL} 

WSGIDaemonProcess site2 python-path=/var/www/py/site2 
WSGIScriptAlias /site2 /var/www/py/site1/site2/wsgi.py process-group=site2 application-group=%{GLOBAL} 

UPDATE

Hinweis, dass es eine ganze Blog-Post über diese und jetzt andere Ursachen.

+2

Das hat wirklich funktioniert, danke! Allerdings habe ich jetzt ein anderes Problem: Wenn ich versuche, beide Seiten im selben Browser zu besuchen, meldet es mich manchmal von site2 ab (wenn ich site1 besuche) - aber nicht das Gegenteil ... Könnte das sein, weil ich/site1 und/habe site2? Sollte ich versuchen, was Erik vorschlägt und site1.sites.gr und site2.sites.gr haben? – Serafeim

+3

Sie müssen SESSION_COOKIE_NAME oder SESSION_COOKIE_PATH für jede Site unterschiedlich festlegen, da sie sich in derselben Domäne befinden. Siehe http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango –

2

Ihre Apps hören auf demselben Port und es scheint kein Proxy zu sein, der sie an andere delegiert.

Sie entweder die Einrichtung Virtual innerhalb Apache oder Nginx, lighttpd oder etwas anderes nutzen eine richtige Proxy

+0

Kann ich nicht über die andere URL (site1 vs site2) ???? Ich möchte keine anderen Ports verwenden oder einen Proxy konfigurieren!Ich möchte nur zwei Django-Apps auf dem gleichen Apache-Host ausführen - ich habe an anderer Stelle gelesen, dass dies möglich ist :( – Serafeim

+3

Ja, das ist, was virtualhosts sind, readthedocs –

+0

Also sollte ich meine zwei Websites mit Gunicorn auf verschiedenen Ports ausführen und dann einfach hinzufügen die folgenden "ProxyPass/site1 http://127.0.0.1:8111/ ProxyPassReverse/site1 http://127.0.0.1:8111/" für beide Seiten auf meiner httpd.conf ?? – Serafeim

1

Graham Dumpleton Antwort ist, die Sie wahrscheinlich am nächsten lesen wollen, aber ich würde vorschlagen, sich eine Menge von Sodbrennen sparen, indem Sie Ihre zwei Djangos an der Wurzel der verschiedenen Sub-Domains Hosting statt an Nicht-root-Speicherorte in derselben Domäne. Es gibt viele Möglichkeiten, nicht-root Django-Sites IMHO zu betreiben.

Viel Glück!

+2

Nun, nach ca. 8 Monaten (nicht schwerer) Produktionseinsatz, mit vier verschiedenen Seiten (/ site1,/site2, site3 und site4), alles funktioniert wirklich gut (ja, sogar Sitzungen mit der Einstellung SESSION_COOKIE_NAME)! Die einzige Sache, an die man sich erinnern sollte, ist, niemals absolute URLs zu verwenden, sondern nur über revese und {% url%} - nach all dem ist der Django-DRY-Weg :) – Serafeim