2009-04-18 19 views
6

Mam zamiar wdrożyć aplikację Django na serwerze WWW nginx i chcę się upewnić, że buduję system poprawnie.nginx + FastCGI dla aplikacji django --- uruchomić dwa serwery WWW lub jeden?

Powszechnie wiadomo, że jeśli wdrażasz Django na serwerze apache, to powinieneś umieścić serwer nginx przed aplikacją, aby wyświetlać pliki statyczne, przy których nginx jest bardziej wydajny.

Jeśli zamiast Apache dla kodu Django, chciałbym użyć nginx + FastCGI do hostowania aplikacji Django, czy jest jakikolwiek powód, aby skonfigurować drugą instalację nginx, aby zasiadała przed serwerem nginx obsługującym zawartość dynamiczną , aby obsłużyć zawartość statyczną, a także przekierowanie do zawartości dynamicznej?

Czy istnieją różne parametry konfiguracyjne dla zawartości statycznej i dynamicznej, które sprawiają, że chcę zachować oddzielne serwery lub czy mogę hostować je wszystkie w pojedynczej instalacji nginx, z niektórymi adresami URL zamapowanymi na django treść, a reszta jest mapowana na statyczną zawartość obsługiwaną z tej samej instalacji nginx?

Dzięki za porady!

Odpowiedz

5

Większość dyrektyw config mogą żyć wewnątrz bloków lokalizacji (czyli nie są globalne tylko oni) i to bardzo powszechne w tym jest praktyka. Nie powinieneś mieć problemu z ustawianiem tego przy użyciu tylko 1 instancji nginx.

Jedną z najlepszych rzeczy na ten temat jest to, że możesz ustawić to w ten sposób na początku, a następnie zmienić zdanie w późniejszym czasie, przełączając blok lokalizacji, aby przejść do serwera zaplecza, bez żadnego z tego widocznego dla świata zewnętrznego.

Więc śmiało, zrób to teraz na jednym serwerze, wiedząc, że możesz później zainstalować serwer lub klastrę zaplecza, ponieważ musisz skalować.

+0

Dzięki, dwc! Dobra uwaga na temat korzystania z jednego serwera teraz i przekazywania ruchu dalej za pomocą bloku lokalizacji, jeśli muszę oddzielić trochę rzeczy. – Adam

0

Jestem pewien, że można skonfigurować wszystkie treści statyczne i dynamiczne w jednym pliku konfiguracyjnym z jednym serwerem nginx

+0

To prawda. Sposób, w jaki to robisz, jest związany z wieloma dyrektywami "lokalizacji" w twoim bloku "serwera". Zastanawiam się, czy parametry dla plików statycznych i dynamicznych (keepalives itp.) Są sprzeczne z każdym innym, i jeśli wzorce dostępu dla zawartości statycznej i zawartości dynamicznej w jakiś sposób przeszkadzają w procesach roboczych, jeśli znajdują się one na tym samym demonie . – Adam

2

Powiedziałbym, że proxy-django na swój własny serwer naprawdę przychodzi, jeśli używasz mod_python, czyli: obsługuj statyczne z nginxem i proxy django do instancji apache z uruchomionym mod_python. Z przyjemnością uruchamiam django w lighttpd przez fastcgi z tą samą lighttpd obsługującą statyczną zawartość też.

+0

Cudownie! Dzięki za poradę za pomocą lighttpd! – Adam

4

Aby odpowiedzieć na pytanie dotyczące umieszczenia serwera nginx przed innym nginx: Nie, zwykle nie ma powodu, by to robić. Ta stara rada pochodzi z Apache, szczególnie gdy mod_python został użyty z prefektem MPC Apache. W tej konfiguracji każda instancja Django działałaby jako oddzielny proces, wewnątrz kontenera mod_python/Apache, a to wymagałoby użycia dużej ilości pamięci RAM. Pomysł polegał na tym, aby utrzymywać stałą obsługę plików z dala od Apache, poprzez umieszczenie lekkiego, sterowanego zdarzeniami serwera HTTP, takiego jak nginx, przed ciężkimi procesami Apache. Pozwoliło to zaoszczędzić pamięć RAM i zwiększyć wydajność. W przypadku używania lekkiego serwera, takiego jak nginx, dla wszystkich żądań jest to problem.

nginx ma dobrą obsługę przepisywania adresów URL, zajrzyj do modułu Rewrite.

Twoje pytanie nie określa, jakiego obciążenia (połączeń/sekund) się spodziewasz, ani dlaczego chcesz używać nginx w pierwszej kolejności. Jeśli dotyczy bloga na serwerze VPS lub podobnej instalacji o małym obciążeniu, spójrz na użycie Apache z mod_wsgi w trybie demona.To ma wydajność & wykorzystanie RAM bardzo blisko FastCGI i mod_wsgi niedawno stał się oficjalnie zalecany sposób gospodarzem Django, zobacz http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/

Generalnie chciałbym zaproponować użyciu Apache/mod_wsgi jeśli to możliwe, że jest stabilny i elastyczny kombinacja. Upewnij się, że nie "przedwcześnie optymalizujesz", używając nginx, gdzie Apache + mod_wsgi zrobiłby dobrze. Na przegląd wydajności mod_wsgi w trybie demona patrz: http://code.google.com/p/modwsgi/wiki/PerformanceEstimates

nginx jest niesamowite, ale na rozwiązanie nginx Django jest IMHO lepsze dopasowanie jako równoważenia obciążenia dla wielu przypadkach Apache lub oddzielnego serwera dla plików statycznych. Oba te scenariusze użycia mają znaczenie tylko w przypadku dużych obciążeń.

+0

Świetna odpowiedź! Spróbuję porównać wydajność nginx'a jako zwykłego proxy i nginxa jako mostu fastcgi, gdy tylko będę miał okazję. – Adam

+0

Dzięki Adam. Ale tak naprawdę chodzi o to, że powinieneś zajrzeć do Apache z mod_wsgi w trybie demona. mod_wsgi jest ładowalnym modułem Apache, tzn. działa tylko z Apache. Tryb demona przypomina na wiele sposobów FastCGI, ale używa bogatszego i bardziej nowoczesnego interfejsu WSGI zamiast CGI. –

+1

Używam nginx do obsługi zarówno plików statycznych, jak i procesu didgo fastcgi na moim wspólnym pakiecie webhosting, ponieważ zużycie pamięci nginx jest znacznie mniejsze (około 30 MB dla obu nginx i django) w przeciwieństwie do 100 MB dla apache i django) – Frozenskys