Jak skonfigurować Nginx jako buforujące odwrotne proxy?

143

Ostatnio słyszałem, że Nginx dodał buforowanie do swojej funkcji odwrotnego proxy. Rozejrzałem się, ale nie mogłem znaleźć wielu informacji na ten temat.

Chcę skonfigurować Nginx jako buforujące odwrotne proxy przed Apache / Django: aby mieć żądania proxy Nginx dla niektórych (ale nie wszystkich) dynamicznych stron do Apache, a następnie buforować wygenerowane strony i obsługiwać kolejne żądania tych stron z bufora.

Idealnie chciałbym unieważnić pamięć podręczną na 2 sposoby:

  1. Ustaw datę ważności dla buforowanego elementu
  2. Aby jawnie unieważnić buforowany element. Np. Jeśli mój backend Django zaktualizował pewne dane, chciałbym powiedzieć Nginx, aby unieważnił pamięć podręczną dotkniętych stron

Czy można tak ustawić Nginx? W jaki sposób?

Kontynuacja
źródło
Nie testowano, ale z gumroad.com/l/ngx_purge : „ngx_purge to czysty moduł Lua dla Nginx, który pozwala użytkownikowi usunąć obiekt z pamięci podręcznej nginx.”.
Jaime Hablutzel

Odpowiedzi:

97

Nie sądzę, że istnieje sposób na jawne unieważnienie buforowanych elementów, ale oto przykład, jak zrobić resztę. Aktualizacja: Jak wspomniał Piotr w innej odpowiedzi, istnieje moduł czyszczenia pamięci podręcznej , którego można użyć. Możesz także wymusić odświeżenie buforowanego elementu za pomocą proxy_cache_bypass nginx - więcej informacji znajdziesz w odpowiedzi Cheriana .

W tej konfiguracji elementy, które nie są buforowane, będą pobierane z example.net i przechowywane. Wersje buforowane będą obsługiwane przez przyszłych klientów, dopóki nie będą już ważne (60 minut).

Nagłówki HTTP sterujące pamięcią podręczną i wygasają będą honorowane, więc jeśli chcesz jawnie ustawić datę wygaśnięcia, możesz to zrobić, ustawiając odpowiednie nagłówki w czymkolwiek, co zastępujesz.

Istnieje wiele parametrów, które można dostroić - zobacz dokumentację modułu proxy Nginx, aby uzyskać więcej informacji na ten temat, w tym szczegółowe informacje na temat znaczenia różnych ustawień / parametrów: http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}
Casey
źródło
7
Jest to rozsądny pierwszy krok dla nowych aplikacji, które nie mają 20k / req / s.
5
@Barry, jaki będzie drugi steP?
Jürgen Paul
42
@ Legit - nie wiem, ale tradycyjnie ostatnim krokiem jest „Zysk” :-)
Stephen C
Niestety nie działa z Nginx 1.11. Ponieważ ostatnia aktualizacja miała miejsce około 3 lata temu, wygląda na to, że to już nie jest rozwiązanie.
izogfif
Co oznacza: inactive=600moznacza? Czy nie inactivema być czas? `[inactive=time]
NeverEndingQueue
47

Możesz w szczególności unieważnić buforowane strony

proxy_cache_bypass       

Powiedz, że chcesz buforować stronę, ustaw pamięć podręczną w ten sposób

location = /pageid {
  proxy_pass http://localhost:82;
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

Teraz, gdy chcesz unieważnić tę stronę i ponownie buforować

Wykonaj tajne połączenie curl z nagłówkiem

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

Spowoduje to unieważnienie i buforowanie.

Działa z Nginx 0.7.

Jako dodatkowy bonus add_header X-Cache-Statusmożna go użyć do sprawdzenia, czy strona pochodzi z pamięci podręcznej, czy nie.

Cherian
źródło
Może to aktualizować buforowane strony tylko wtedy, gdy nowa strona jest również buforowana. Jeśli usunąłeś stronę (404 lub inne błędy są teraz obsługiwane przez backend), strona wysyła teraz Set-Cookie lub nagłówek „Content-Control: private”, zawartość w pamięci podręcznej nie zostanie „unieważniona”.
rbu
36

Proponuję wypróbować Varnish . Lakier jest specjalnie zaprojektowany jako pamięć podręczna odwrotnego proxy. Uhonoruje wszystkie nagłówki kontroli pamięci podręcznej wysyłane z serwera źródłowego, co spełnia Twoje pierwsze żądanie.

W przypadku drugiego żądania wyraźne unieważnienie. Moim zdecydowanym zaleceniem jest zmiana nazwy adresu URL zasobu, który chcesz unieważnić, przez zmianę nazwy pliku lub użycie jakiejś formy pomijania pamięci podręcznej ciągu zapytań. Varnish ma PURGEoperację, która usunie zasób z pamięci podręcznej Varnish, ale nie da ci kontroli nad innymi buforami między tobą a użytkownikiem. Jak powiedziałeś, że chcesz jawnie oczyścić zasób, standardowe nagłówki kontrolne HTTP nie pomogą. W takich przypadkach najbardziej niezawodnym sposobem na pokonanie buforowania zasobu jest zmiana jego nazwy.

Dave Cheney
źródło
Czy możesz wyjaśnić, co miałeś na myśli, mówiąc „zmieniając nazwę pliku lub używając jakiejś formy pomijania pamięci podręcznej ciągu zapytań”? Nie jestem pewien, czy rozumiem, dlaczego nie warto używać operacji takiej jak PURGE.
Kontynuacja
5
+1 za lakier. Zawsze lepiej jest używać odpowiednich narzędzi do pracy.
Tom O'Connor,
4
@below: Niemal nie ma nadziei na dotyk lakieru na arenie wydajności i wszechstronności. Jest to wspierane przez jednego z wiodących programistów jądra FreeBSD i oddany zespół z siedzibą w Europie. Lakier jest produkowany na Twitterze, Heroku i wielu innych.
2
Najprostszym przykładem pomijania pamięci podręcznej jest dołączenie numeru wersji w ciągu zapytania do zasobu statycznego, aby style.css zmieniło się w style.css? 123. Jeśli chcesz wypchnąć nową wersję pliku, zmień adres URL zasobu na style.css? 124, a teraz pamięci podręczne będą go odbierać jako całkowicie nowy zasób, który będzie buforowany osobno. Apache będzie obsługiwał plik style.css z dołączonym dowolnym ciągiem zapytania, więc nie są wymagane żadne zmiany w rzeczywistym pliku.
chmac,
3
Jeśli to możliwe, najlepiej umieścić bufor pamięci podręcznej w samej nazwie pliku, na przykład style.v123.cssdlatego, że niektóre pamięci podręczne nie będą buforować żądań zawierających ciąg zapytania.
Noah McIlraith,
8

Aby unieważnić wybrane strony, możesz użyć łatki „cache_purge” dla nginx-0.8.x, która robi dokładnie to, co chcesz;)

Jest dostępny tutaj .


źródło
8

Większość narzędzi buforowania (Citrix) umożliwia wymuszone odświeżenie (Ctrl + r), aby ponownie zapełnić buforowaną stronę.

Oto sztuczka, którą znalazłem, aby zrobić coś podobnego w Nginx.

server  {
        # Other settings
        proxy_pass_header       Set-Cookie; # I want to cache logged-in users
        proxy_ignore_headers    X-Accel-Redirect;
        proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        if ($http_cache_control ~ "max-age=0") {set $eac 1;}
        proxy_cache_bypass $eac;
}

Zakłada się, że kiedy wykonujesz Ctrl + rw przeglądarce, nagłówek Cache-Control ma w żądaniu max-age = 0. Wiem, że Chrome to robi, ale nie próbowałem w innych przeglądarkach. Dodanie większej liczby pól nagłówka może być łatwe, wystarczy dodać więcej instrukcji if, które ustawiają $eaczmienną na 1.

Randy Wallace
źródło
4

Wierzę, że NginxHttpProxyModule jest w stanie obsłużyć żądania HTTP. Poszukaj dyrektyw zaczynających się od:

proxy_cache

Tak, możliwe jest kontrolowanie zachowania pamięci podręcznej za pomocą dyrektyw takich jak:

proxy_cache_valid
Taras Chuhay
źródło
3

Biorąc pod uwagę fakt, że nie można znaleźć na nim dokumentów, byłbym trochę ostrożny, jeśli chodzi o poleganie na nim podczas produkcji. Czy rozważałeś Lakier? To mój „nginx odwrotnych serwerów proxy”, mały, lekki, wykonujący jedną pracę i wykonujący ją dobrze.

womble
źródło
Dokumentacja jest tutaj: wiki.nginx.org/NginxHttpProxyModule#proxy_cache
rmalayter
2

Jeśli użyjesz tagów eTag w swojej aplikacji i umieścisz przed nim nginx, wówczas zajmie się ono wygaśnięciem, ponieważ jeśli eTag się zmieni, spowoduje to unieważnienie pamięci podręcznej.

Martin Murphy
źródło
Naprawdę? Wygląda na to, że ngnix pasuje do etaga i nigdy nie rozmawia z aplikacją, aby dowiedzieć się, czy istnieje zaktualizowany etag.
John Naegle
2

Możesz kontrolować wygasanie pamięci podręcznej Nginx za pomocą wielu dyrektyw / parametrów:

  • proxy_cache_valid 200 302 10m;
  • dodając jeden z nagłówków HTTP poniżej (priorytet jest ważny - sprawdź mój post na blogu ):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • inactiveparametr w proxy_cache_pathdyrektywie:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

Polecam mój post na blogu, jeśli chcesz dowiedzieć się więcej o buforowaniu Nginx.

Temat usuwania jest naprawdę interesujący, ponieważ ta funkcja istnieje tylko w Nginx Plus (edycja komercyjna Nginx). Naprawdę podoba mi się odpowiedź @ randy-wallace. Ale są też inne możliwości, takie jak moduł ngx_cache_purge .

Najprostszą rzeczą, którą możesz zrobić, to ręcznie usunąć plik z pamięci podręcznej:

  • wygeneruj swój klucz skrótu:

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • usuń plik z systemu plików:

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    
czerasz
źródło
1

Dla przyszłych użytkowników: tymczasem odwrotne proxy nginx ma zintegrowane buforowanie, a dokumenty są dostępne pod adresem:

Składnia: strefa pamięci podręcznej proxy | poza;

Domyślnie: proxy_cache wyłączone;

Kontekst: http, serwer, lokalizacja

Definiuje strefę pamięci współdzielonej używaną do buforowania. Z tej samej strefy można korzystać w kilku miejscach. Wartość parametru może zawierać zmienne (1.7.9). Parametr wyłącza buforowanie odziedziczone z poprzedniego poziomu konfiguracji.

Tarik Huclaslun
źródło
Cześć Tarik, pytanie było bardzo szczegółowe na temat tego, co należy osiągnąć, i wykracza poza „tylko włączanie pamięci podręcznej”.
asdmin
0
fastcgi_cache_path / opt / nginx-cache poziomy = 2: 2 keys_zone = img: 50m;

    lokalizacja / img / {
        backcgi_pass $ backend;
        obejmują fcgi_params;
        fastcgi_intercept_errors off;   
        fastcgi_cache_key $ server_addr $ request_uri;       
        fastcgi_cache img;
        fastcgi_cache_valid any 1m;
        fastcgi_hide_header Zestaw plików cookie;
    }

To tworzy pamięć podręczną dla / img / location. Jest w / opt / nginx-cache. Obiekty są buforowane przez 1 minutę.

Możesz pisać różne kody odpowiedzi zamiast jakichkolwiek.

Teraz nie możesz unieważnić pamięci podręcznej dla wybranych stron. Może w wersji 0.8.x będzie to możliwe.

Lexsys
źródło
Pierwotne pytanie dotyczyło używania nginx przed Apache, a nie przed aplikacją fastcgi obsługiwaną przez nginx.
Graham Dumpleton
0

Istnieje wtyczka nginx o nazwie ncache, która twierdzi, że jest „systemem pamięci podręcznej opartym na serwerze internetowym nginx. Szybszym i bardziej wydajnym niż kałamarnica”.

sajal
źródło