2009-10-28 15 views
7

Zajmuję się tworzeniem strony Django. Dokonuję wszystkich zmian na serwerze na żywo, tylko dlatego, że jest to łatwiejsze. Problem polega na tym, że od czasu do czasu wydaje się, że chcesz cache'ować jeden z plików * .py, nad którymi pracuję. Czasami, gdy bardzo dużo odświeżam, przełącza się między starszą wersją strony i nowszą wersją.Django + WSGI: Odświeżanie problemów?

Mój zestaw górę jest mniej więcej jak to, co jest opisane w samouczki Django: http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/#howto-deployment-modwsgi

mam zgadywania ona to robi, bo to rozpalania wiele wystąpień z obsługi WSGI, i w zależności od obsługi do którego wysłano żądanie http, mogę otrzymać różne wersje strony. Ponowne uruchomienie Apache wydaje się naprawić problem, ale jest denerwujące.

Naprawdę nie wiem zbyt wiele o WSGI lub "MiddleWare" ani o żadnej z tych funkcji obsługi zgłoszeń. Pochodzę z tła PHP, gdzie to wszystko działa :)

W każdym razie, jaki jest miły sposób rozwiązania tego problemu? Czy uruchomienie programu obsługi WSGI jest "trybem demona", aby złagodzić problem? Jeśli tak, jak mogę uruchomić go w trybie demona?

Odpowiedz

2

można rozwiązać ten problem przez nie edytowania kodu na serwerze na żywo. Poważnie, nie ma na to żadnego usprawiedliwienia. Rozwijaj się lokalnie, używając kontroli wersji, a jeśli musisz, uruchom swój serwer z kasy na żywo, z hakiem po zatwierdzeniu, który sprawdza twoją najnowszą wersję i restartuje Apache.

+1

tak, ale czasami środowisko prod zachowuje się inaczej niż wbudowany serwer dev, więc nie ma wyboru :) – jujule

+0

@jujule: możesz skonfigurować domenę testową na serwerze prod, dzięki czemu możesz przetestować to, co rozwijasz lokalnie. Nie mogę wymyślić żadnych wymówek, które usprawiedliwiają edytowanie kodu na serwerze prod. – shanyu

+0

to tyle pracy, aby zreplikować środowisko serwera! mój serwer działa z Ubuntu/Apache2/Postgres, a mój komputer domowy używa Win7 ... i nawet nie próbowałem zainstalować pozostałych dwóch. zakładając, że udało mi się to uruchomić, w jaki sposób zmigrować bazę danych do produkcji? – mpen

4

Ponieważ używasz mod_wsgi w trybie wbudowanym, twoje zmiany nie są automatycznie widoczne. Widuje się je od czasu do czasu, ponieważ Apache czasami uruchamia nowe wystąpienia obsługi, które przechwytują aktualizacje.

Możesz rozwiązać ten problem, używając trybu demona, zgodnie z opisem here. W szczególności, będziemy chcieli, aby dodać następujące wskazówki do konfiguracji Apache:

WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP} 
WSGIProcessGroup example.com 
+0

Nie potrzebuję wirtualnych hostów, aby to działało? – mpen

+1

Zakładam, że możesz po prostu umieścić deklaracje w tym samym kontekście co WSGIScriptAlias. –

+0

To wydaje się nie mieć żadnego efektu, btw. – mpen

5

Zapoznaj się z dokumentacją mod_wsgi, zamiast polegać na minimalnej informacji dotyczącej hostingu mod_wsgi zawartej w witrynie Django. W partcular, czytany:

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

To powie Ci dokładnie, jak kod źródłowy przeładunku prace w mod_wsgi, w tym monitorze można wykorzystać do realizacji tego samego rodzaju kodu źródłowego przeładunkowego że Django runserver robi. Zobacz także, o których rozmowach dowiesz się, jak zastosować to w Django.

http://blog.dscpl.com.au/2008/12/using-modwsgi-when-developing-django.html http://blog.dscpl.com.au/2009/02/source-code-reloading-with-modwsgi-on.html

16

prowadzenie procesu w trybie demona nie pomoże. Oto, co się dzieje:

mod_wsgi uruchamia wiele identycznych procesów do obsługi żądań przychodzących dla Twojej witryny Django. Każdy z tych procesów to własny interpreter języka Python i może obsługiwać przychodzące żądania WWW. Te procesy są trwałe (nie są wywoływane i zrywane dla każdego żądania), więc pojedynczy proces może obsłużyć tysiące żądań jeden po drugim. mod_wsgi jest w stanie obsługiwać wiele zapytań internetowych jednocześnie, ponieważ istnieje wiele procesów.

Każdy interpreter języka Python dla każdego procesu ładuje moduły (niestandardowe pliki Pythona) za każdym razem, gdy wykonywany jest "moduł importu". W kontekście django stanie się to, gdy potrzebny będzie nowy plik view.py z powodu żądania internetowego.Po załadowaniu modułu znajduje się on w pamięci, a wszelkie zmiany wprowadzone w pliku nie zostaną odzwierciedlone w tym procesie. W miarę pojawiania się kolejnych zapytań internetowych, interpreter języka Python po prostu użyje wersji modułu, która jest już załadowana do pamięci. Widzisz niespójności między odświeżeniami, ponieważ każda twoja prośba sieciowa może być obsługiwana przez różne procesy. Niektóre procesy mogły załadować moduły Pythona podczas wcześniejszych wersji kodu, a inne mogły je załadować później (ponieważ te procesy nie otrzymały żądania WWW).

Proste rozwiązanie: za każdym razem, gdy modyfikujesz swój kod, zrestartuj proces Apache. Najczęściej jest to tak proste, jak uruchamianie jako root z powłoki "/etc/init.d/apache2 restart". Wierzę, że działa również proste ładowanie, które jest szybsze, "/etc/init.d/apache2 reload"

Rozwiązanie demona: Jeśli używasz mod_wsgi w trybie demona, wszystko co musisz zrobić, to dotknąć (polecenie unix) lub zmodyfikuj plik skryptu wsgi. Aby wyjaśnić post scrompt.com, modyfikacje kodu źródłowego w Pythonie nie spowodują przeładowania kodu przez mod_wsgi. Ponowne załadowanie występuje tylko wtedy, gdy plik skryptu wsgi został zmodyfikowany.

Ostatnia uwaga: tylko mówiłem o wsgi jako o używaniu procesów dla prostoty. WSGI faktycznie używa pul wątków wewnątrz każdego procesu. Nie sądziłem, że ten szczegół jest odpowiedni dla tej odpowiedzi, ale możesz dowiedzieć się więcej, czytając o mod_wsgi.

+0

Niezłe wytłumaczenie! Dzięki. Czy ta kombinacja wątków jest korzystniejsza/szybsza niż to, co robi PHP? – mpen

+0

Podczas korzystania z wielowątkowości musisz walczyć z GIL Pythona. W związku z tym, w przypadku kodu obsługi żądań o intensywnym obciążeniu, możesz trochę cierpieć z powodu niemożności wykorzystania wielu procesorów/rdzeni w jednym procesie. Jeśli kod ma dostęp do baz danych i innych modułów, które uwalniają GIL, to nie stanowi to problemu. W każdym razie, znacznie bardziej skomplikowane. Zasugeruj, aby przeczytać "http://blog.dscpl.com.au/2007/09/parallel-python-discussion-and-modwsgi.html". –

+0

BTW, tryb demona może pomóc, ponieważ pozwala uruchomić monitor kodu w sposób opisany w dokumentacji mod_wsgi wymienionej w innej odpowiedzi. W ten sposób każda zmiana w kodzie Pythona, a nie tylko w pliku skryptu WSGI, może automatycznie uruchomić ponowne uruchomienie grupy procesów demona. –