2012-07-16 18 views
20

Chcę wdrożyć dwie różne aplikacje django na tym samym hoście: pierwsza będzie odpowiadać adresowi url/stronie1, a druga adresowi URL/stronie2. Oto moja konfiguracja:Wdrażanie wielu aplikacji django na serwerze Apache przy użyciu mod_wsgi

 
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> 

Również tutaj jest plik wsgi.py zarówno do zastosowań

 
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() 

Teraz tutaj jest mój problem. Kiedy wchodzę na mój serwer, załóżmy, że czasami ładuje stronę1, a czasami ładuje stronę2! To samo dotyczy odwiedzin http://app1.sites.gr/site2 ... Sometiems Dostaję stronę powitalną dla strony1, czasami otrzymuję stronę powitalną dla strony2! Uderzam w F5 i otrzymuję różne strony powitalne. Sprawdziłem wszystko, co dla poprzednich godzin i nie znalazłem nic dziwnego ...

Proszę, powiedz mi, co może być problem, zanim zwariuję ...

Dzięki!

Odpowiedz

41

To jest problem z plikiem wsgi.py generowanego przez Django 1.4. Nie będzie działać tam, gdzie próbuje hostować dwie różne instancje Django w tym samym procesie, nawet w oddzielnych podinterpreterach.

Zmiana:

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

do:

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

Albo jeszcze lepiej użyć trybu demona i przekazać każdy uruchomić w odrębnych grupach proces demona.

Oznacza to, że zamiast:

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 

użytku:

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

Należy pamiętać, że istnieje cała blogu o tej i innych przyczyn teraz.

+2

To zadziałało, dziękuję! Jednak mam teraz inny problem: kiedy próbuję odwiedzić obie witryny w tej samej przeglądarce, czasami loguje mnie on ze strony2 (kiedy odwiedzam stronę1) - ale nie odwrotnie ... Czy to możliwe, ponieważ mam/site1 i/site2? Czy powinienem spróbować tego, co Erik proponuje i mieć site1.sites.gr i site2.sites.gr? – Serafeim

+3

Musisz ustawić SESSION_COOKIE_NAME lub SESSION_COOKIE_PATH inaczej dla każdej witryny, ponieważ są one w tej samej domenie. Zobacz http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango –

2

Twoje aplikacje słuchają tego samego portu i nie ma serwera proxy, który deleguje je do różnych.

albo trzeba VirtualHosts instalacyjnych wewnątrz Apache lub użyć Nginx, lighttpd lub coś innego, aby stworzyć właściwą proxy

+0

Nie mogę przekazać odpowiedniego skryptu za pośrednictwem innego adresu URL (site1 vs site2) ???? Nie chcę używać innych portów ani konfigurować proxy!Chcę tylko uruchomić dwie aplikacje django na tym samym hoście apache - czytałem gdzie indziej, że jest to możliwe :( – Serafeim

+3

Tak, to jest to, do czego służą virtualhosts, readthedocs –

+0

Więc czy powinienem uruchomić moje dwie strony używając gunicorn na różnych portach, a następnie po prostu dodać następujące "ProxyPass/site1 http://127.0.0.1:8111/ ProxyPassReverse/site1 http://127.0.0.1:8111/" dla obu witryn na moim httpd.conf ?? – Serafeim

1
odpowiedź

Grahama Dumpleton jest jeden prawdopodobnie chcesz czytać najbliżej, ale chciałbym zaproponować oszczędzając sobie sporo zgaga przez hosting dwa Djangos u podstaw różnych subdomen zamiast na lokalizacje inne niż root w tej samej domenie. Istnieje wiele gotch do uruchamiania nie-rootowych serwisów Django IMHO.

Powodzenia!

+2

Po około 8 miesiącach (nie ciężkiego) wykorzystania produkcji, z czterema różnymi witrynami (/ site1,/site2, site3 i site4), wszystko działa naprawdę świetnie (tak, nawet sesje z ustawieniem SESSION_COOKIE_NAME)! Jedyną rzeczą do zapamiętania jest to, aby nigdy nie używać bezwzględnych adresów URL, ale tylko poprzez otwarcie i {% url%} - po wszystkim to jest Django-DRY-way :) – Serafeim

Powiązane problemy