Lakier Nginx Nginx Django?

13

Mam aplikację django i chcę skonfigurować Varnish na serwerze przed nim. W innym wątku dotyczącym błędu serwera ktoś zaproponował postawienie Nginx przed Varnish.

Czy powinienem umieścić Nginx przed Varnish na serwerze pamięci podręcznej? Jeśli tak, czy powinienem używać Nginx na serwerze aplikacji?

Enrico
źródło

Odpowiedzi:

10

Mówimy w sumie 1–3 serwery frontendowe, a nie duża farma serwerów z równoważeniem obciążenia między warstwami?

Umieszczenie nginx przed Vanish umożliwia kompresję HTTP w locie. Jest to najlepsza praktyka w zakresie wydajności, ale można jej zrezygnować. (Treść w Varnish jest często nieskompresowana, dzięki czemu ESI Obejmuje pracę, dzięki czemu nie musisz radzić sobie z wieloma buforowanymi wersjami tego samego obiektu w zależności od dopasowania nagłówka / przeglądarki Vary).

Jeśli chodzi o nginx na serwerze aplikacji - czy Apache z mod_wsgi nie jest obecnie zalecanym i najczęstszym sposobem wdrażania nowych instalacji Django? Nie znam ważnego powodu używania nginx / fastcgi nad Apache / mod_wsgi dla Django; ale powinieneś uzyskać poradę od eksperta Django.

Co do lakieru mającego atrakcyjne funkcje równoważenia obciążenia, którego nginx nie ma, nie rozumiem, czym one są? Lakier ma równoważenie losowe i okrągłe. nginx ma funkcję round-robin, adres IP klienta i spójny skrót - nie widzę znaczących korzyści dla Varnish? Czy to ładna konfiguracja VCL lub Varnish, czy coś jeszcze?

W przypadku niewielkiej konfiguracji 1-3 serwerów chyba po prostu bym to zrobił

Lakier -> Apache / mod_wsgi / Django

albo może

Squid -> Apache / mod_wsgi / Django

i dla uproszczenia ignoruj ​​kompresję HTTP, chyba że pasmo jest drogie.

Aktualizacja:

Graham Dumpleton napisał poniżej cenny komentarz. Wspomina o bardzo powszechnej konfiguracji, na przykład blogu na VPS lub małej farmie internetowej bez buforowania:

nginx -> Apache / mod_wsgi / Django

To bardzo dobre rozwiązanie z kilku powodów:

  1. Prosta konfiguracja
  2. nginx, który ma dużą szybkość i minimalny narzut, obsługuje statyczne wyświetlanie plików i utrzymywanie połączenia z przeglądarką.
  3. Django działa w doskonałej mod_wsgi Grahama Dumpletona, zalecanej platformie dla Django.

Powodem, dla którego nie wspomniałem o tym na początku, jest to, że OP wymagało, aby Varnish, rozwiązanie buforowania o bardzo wysokiej wydajności. Kombinacja nginx / Apache / mod_wsgi nie może buforować z poziomem wydajności i elastyczności pasującym do Varnish.

Jesper M.
źródło
2
Możesz nawet użyć „nginx -> Apache / mod_wsgi / Django”, jak wiele osób robi z różnych dobrych powodów.
Graham Dumpleton
4
Inną rzeczą, którą zapewnia nginx w tym przypadku użycia, którego wielu nie zdaje sobie sprawy, jest to, że nginx izoluje Apache od powolnych klientów. Wynika to z faktu, że treść żądania do określonego rozmiaru nie jest przesyłana strumieniowo przez Nginx. Zamiast tego buforuje nagłówki i zawartość żądań i tylko żądanie proxy, gdy ma to wszystko. Oznacza to, że przekazuje je Apache tylko wtedy, gdy wszystkie informacje potrzebne do obsługi żądania są dostępne. W ten sposób Apache / mod_wsgi będzie zajęty przez możliwie najkrótszy czas, a procesy / wątki nie będą powiązane przez powolnego klienta. Buforowanie odbywa się również na odwrocie, dzięki czemu Apache może również zakończyć szybciej.
Graham Dumpleton
2
@Graham Dumpleton: Bardzo miło cię tu mieć, mam nadzieję, że pozostaniesz. :-). Jeśli chodzi o multipleksowanie HTTP nginx / obsługę inteligentnych połączeń, całkowicie się zgadzam.
Jesper M
Przede wszystkim dziękuję Jesperowi i Grahamowi za poświęcenie czasu na napisanie tak kompleksowych odpowiedzi. Planuję umieścić serwer równoważenia obciążenia przed dwoma serwerami aplikacji. Jeden serwer obsłuży większość ruchu, a drugi jest używany głównie do przełączania awaryjnego i testowania wersji beta nowych funkcji.
Enrico,
Lakier jest atrakcyjny, ponieważ daje mi pełną kontrolę nad tym, które żądania są wysyłane do których backendów. Lakier sprawdza również serwery zaplecza, przełączanie awaryjne jest proste w konfiguracji i obsługuje z powodzeniem wolne / martwe backendy (jeśli oba serwery umrą).
Enrico,
4

Możesz używać nginx bez lakieru do proxy i buforowania zawartości.

cichy
źródło
2
lakier ma kilka atrakcyjnych funkcji równoważenia obciążenia, których nginx nie wychodzi z pudełka
Enrico,
4
jakie funkcje na przykład?
cichy
4

Korzystam z Nginx, Varnish i Apache / mod_wsgi / Django. Zacząłem od następującej konfiguracji:

Nginx -> Apache / mod_wsgi / Django

Gdy zacząłem widzieć znaczne obciążenie Apache, dodałem Lakier:

Nginx -> Lakier -> Apache / mod_wsgi / Django

Używam Nginx jako swego rodzaju „routera URL”. Żądania administratora Django są wysyłane bezpośrednio z Nginx do Apache. Żądania klientów są wysyłane z Nginx do Varnish, który buforuje żądania z Apache, a także udostępnia „ozdobne” elementy z pamięci podręcznej, jeśli serwery aplikacji są niedostępne.

Mój serwer Nginx obsługuje również bezpośrednio niektóre treści statyczne (np. Obrazy, CSS i pliki javascript).

Ogólnie wydajność była doskonała. Zauważyłem kilka zastrzeżeń, o których powinienem wspomnieć:

  1. W przypadku zajętej witryny ponowne uruchomienie Varnish może spowodować wzrost obciążenia na serwerach aplikacji, dlatego najlepiej ograniczyć do minimum restart Varnish. (Wydaje się, że Varnish nie ma „przeładowania” jak Nginx / Apache, gdzie po prostu ponownie odczytuje pliki VCL). Odwrotnie, przeładowanie konfiguracji Nginx ma minimalny wpływ. Z tego powodu wykonuję większość przepisywania adresów URL i „routingu” w Nginx.
  2. Lakier jest łatwy do wklejenia między Nginx a Apache. Jeśli zaczniesz zauważać duże obciążenie serwerów aplikacji, dodanie lakieru nawet przy domyślnej konfiguracji może naprawdę coś zmienić.
  3. Jeśli korzystasz z Varnish, zdecydowanie musisz pomyśleć o tym, jak poradzisz sobie z unieważnieniem pamięci podręcznej.
  4. Z mojego doświadczenia wynika, że ​​uchwyty do lakierowania zawiodły zaplecza nieco bardziej wdzięcznie niż Nginx (jak już wcześniej wspomniałeś).
David Narayan
źródło
Nigdy nie widziałem lakieru za czymś innym. Lakier jest zwykle modułem równoważącym obciążenie, który wykonuje router URL. Masz więc 2 serwery i 1 serwer proxy lub 2 serwery proxy i 1 serwer? Q
ioanb7
2

Używam Nginx-> Lakier-> uWSGI-> Django

Mechanizm
źródło