2011-07-06 10 views
39

Próbuję dostać dwa (lub więcej) aplikacje Django utworzonych podkatalogów w ramach tej samej domeny, np:Wiele aplikacji mod_wsgi na jednego wirtualnego hosta kierowanie do niewłaściwej aplikacji

http://example.com/site1/ 
http://example.com/site2/ 

wiem, że normalnie to działa dobrze, konfigurując wirtualny serwer apache:

<VirtualHost *:80> 
    ... 
    WSGIScriptAlias /site1 /path/to/site1.wsgi 
    WSGIScriptAlias /site2 /path/to/site2.wsgi 
</VirtualHost> 

Teraz sprawdziłem, że każda strona działa pojedynczo. Ale kiedy próbuję uruchomić obie strony obok siebie, apache wysyła mnie do dowolnej witryny, w której proces roboczy został załadowany jako pierwszy. Przykład:

  1. restart apache skonfigurowany służyć 6 Odpowiedź
  2. Załaduj example.com/site1/, uzyskać odpowiednią stronę
  3. Załaduj example.com/site2/, uzyskać odpowiednią stronę
  4. Powtórz 2 i 3 2 razy więcej.
  5. Odśwież stronę example.com/site1/, obserwuj cyklicznie od strony do witryny.

Skutecznie, dla dowolnej liczby procesów roboczych, przechodzi przez całkowitą liczbę wysyłanych żądań do któregokolwiek z tych pierwszych, niezależnie od dyrektywy WSGIScriptAlias. Bez względu na to, co robię (ustawienie WSGIProcessGroup, tryb demona a tryb wbudowany lub dyrektywy) nadal wykazuje to zachowanie.

Jeśli ktokolwiek może wskazać, co robię źle, byłoby to fenomenalne!

+0

co masz po wymianie plików skryptów WSGI z opisanego w „http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Sub_Interpreter_Being_Used”? –

Odpowiedz

48

Mam wiele aplikacji WSGI działających na jednej instalacji Apache i odkryłem, że najłatwiej jest po prostu mieć wiele grup procesów - po jednej dla każdej aplikacji.

Jedną z wad, w przeciwieństwie do prób uzyskania pojedynczego procesu uruchamiania obu (lub więcej) aplikacji, jest to, że może to wymagać nieco więcej pamięci rezydentnej, niż można by uniknąć. Ale utrzymuje je dość dobrze rozdzielone i unika kłopotów. I to może nie być problemem dla ciebie (nie było to dla mnie).

(To może nie być takie złe, może być w stanie udostępnić wiele stron tekstowych? To tylko bezmyślne spekulacje, nie zweryfikowałem tego w żaden sposób, ponieważ moja konfiguracja wcale nie była brakująca pamięci)

Oto niektóre fragmenty mojego httpd.conf, w przybliżeniu: odpowiedź

WSGIDaemonProcess khdx_wsgi user=galdosd group=galdosd maximum-requests=10000 
WSGIScriptAlias /khdx /home/galdosd/khdxweb/rel/khdx/apache/django.wsgi 
<Location /khdx> 
WSGIProcessGroup khdx_wsgi 
</Location> 

WSGIDaemonProcess sauron_wsgi user=galdosd group=galdosd maximum-requests=10000 
WSGIScriptAlias /sauron /home/galdosd/finalsauronweb/django-root/apache/django.wsgi 
<Location /sauron> 
WSGIProcessGroup sauron_wsgi 
</Location> 
+3

Korzystanie z maksymalnych żądań jest odradzane w zakładach produkcyjnych, chyba że naprawdę masz przeciążający wyciek pamięci, którego nie możesz naprawić od razu. –

+1

Genialny! Oddzielne grupy procesów zdefiniowane w blokach lokalizacji działały. Żałuję tylko, że nie pytałem o to wcześniej ;-) –

+0

Dzięki, Graham! Czy to ze względu na sporadyczne opóźnienie restartu? –

1

Sam miałem z tym kłopoty. Zamiast próbować uzyskać właściwą konfigurację Apache, zdecydowałem się zamiast tego użyć jednego WSGIScriptAlias ​​i mieć oprogramowanie pośrednie WSGI, które przekierowywało żądania do właściwych aplikacji. Mój kod to https://github.com/zhemao/flotilla. Nie testowałem go tak bardzo, więc używaj go ostrożnie, ale mam nadzieję, że to pomaga.

+1

Nie można tego zrobić w dwóch odrębnych witrynach Django, ponieważ Django opiera się na pojedynczej zmiennej środowiskowej DJANGO_SETTINGS_MODULE, której wartości nie można zmienić z jednego żądania na drugie. –

+0

Dobrze, zapomniałem o tym. –

10

Domingo Ignacio za postawił mnie na właściwe tory. Chciałbym zwrócić uwagę na ważny fakt dotyczący jego działania: Obie grupy procesów muszą znajdować się wewnątrz tej samej VirtualHost. (Jest to oparte na moich testach z Ubuntu 12.04.3 LTS, Apache 2.2.22 i kilkoma aplikacjami WSGI napisanymi w Pythonie.)

Na przykład, ten sam nie pracę dla mnie, co skutkuje możliwością dostępu app1 ale 404 błędu dla App2:

<VirtualHost *> 
     WSGIDaemonProcess app1 user=someuser group=somegroup threads=5 
     WSGIScriptAlias /app1 /app1/app1.wsgi 

     <Location /app1> 
       WSGIProcessGroup app1 
     </Location> 
</VirtualHost> 

<VirtualHost *> 
     WSGIDaemonProcess app2 user=someuser group=somegroup threads=5 
     WSGIScriptAlias /app2 /app2/app2.wsgi 

     <Location /app2> 
       WSGIProcessGroup app2 
     </Location> 
</VirtualHost> 

Usuwanie pola i znaczniki, tak aby mieć pojedynczy VirtualHost, rozwiązał problem:

<VirtualHost *> 
     WSGIDaemonProcess app1 user=someuser group=somegroup threads=5 
     WSGIScriptAlias /app1 /app1/app1.wsgi 

     <Location /app1> 
       WSGIProcessGroup app1 
     </Location> 

     WSGIDaemonProcess app2 user=someuser group=somegroup threads=5 
     WSGIScriptAlias /app2 /app2/app2.wsgi 

     <Location /app2> 
       WSGIProcessGroup app2 
     </Location> 
</VirtualHost> 
Powiązane problemy