odpowiedź wyjściowa jest buforowana do pliku tymczasowego

61

Mam dość duże i powolne (złożonych danych, złożone frontend) aplikację internetową Wbudowany RoRi serwowane przez Pumasię nginxjako reverse proxy. Patrząc na nginxdziennik błędów, widzę sporo wpisów, takich jak:

2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file 
    /var/lib/nginx/proxy/8/47/0000038478 while reading upstream, 
    client: 5.144.169.242, server: engagement-console.foo.it, 
    request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0", 
    upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2", 
    host: "ec.reputationmonitor.it", 
    referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3"

Jestem raczej ciekawy, ponieważ jest mało prawdopodobne, aby strona pozostała taka sama dla różnych użytkowników i różnych interakcji użytkowników, i nie sądzę, że buforowanie odpowiedzi na dysku jest konieczne / przydatne.

Wiem o tym proxy_max_temp_file_sizei ustawiam na 0, ale wydaje mi się to trochę niewygodne (mój serwer proxy próbuje buforować, ale nie ma pliku, w którym można buforować ... jak to może być szybsze?).

Moje pytania to:

  1. Jak mogę usunąć [ostrzeżenie] i uniknąć buforowania odpowiedzi? Czy lepiej jest wyłączyć, proxy_bufferingczy ustawić proxy_max_temp_file_sizena 0? Dlaczego?

  2. Jeśli nginxbuforuje odpowiedź: Kiedy służy buforowanej odpowiedzi, do kogo i dlaczego?

  3. Dlaczego nginxwłącza proxy_bufferingsię domyślnie, a następnie [ostrzega] użytkownika, jeśli faktycznie buforuje odpowiedź?

  4. Kiedy odpowiedź wyzwala tę opcję? Kiedy zajmuje> kilka sekund (ile?), Aby odpowiedzieć? Czy to można skonfigurować?

TIA, ngw.

ngw
źródło
1
Mam wrażenie, że mylisz buforowanie z buforowaniem. Buforowanie to procedura, która pozwala załadować więcej danych niż pozwala na to alokacja pamięci.
słowiański

Odpowiedzi:

75

1) Jak mogę usunąć [ostrzeżenie] i uniknąć buforowania odpowiedzi? Czy lepiej jest wyłączyć buforowanie proxy lub ustawić rozmiar pliku proxy_max_temp_file_size na 0? Dlaczego?

Należy ustawić proxy_max_temp_file_sizena 0, aby go usunąć. proxy_bufferingDyrektywa nie jest bezpośrednio związane z ostrzeżeniem. Możesz go wyłączyć, aby w ogóle zatrzymać buforowanie, ale ogólnie nie jest to zalecane (chyba że jest to potrzebne dla komety ).

2) Jeśli nginx buforuje odpowiedź, kiedy służy buforowanej odpowiedzi, do kogo i dlaczego?

Serwer obsługuje natychmiast, ale klient zwykle ma znacznie wolniejsze połączenie i nie może zużywać danych odpowiedzi tak szybko, jak generowane przez aplikację. Nginx próbuje buforować całą odpowiedź, aby jak najszybciej zwolnić aplikację.

Zobacz także: http://aosabook.org/en/nginx.html

3) Dlaczego nginx domyślnie włącza buforowanie proxy, a następnie [ostrzega] cię, jeśli faktycznie buforuje odpowiedź?

Jak już wspomniałem, proxy_bufferingnie jest to bezpośrednio związane z ostrzeżeniem. Jest generalnie potrzebny do zoptymalizowanych operacji proxy, a wyłączenie go obniża wydajność i przepustowość.

Nginx ostrzega tylko wtedy, gdy odpowiedź nie pasuje do skonfigurowanych buforów pamięci. Możesz zignorować ostrzeżenie, jeśli jest dla Ciebie odpowiednie.

4) Kiedy odpowiedź wyzwala tę opcję? Kiedy odpowiedź zajmuje więcej niż kilka sekund (ile?)? Czy to można skonfigurować?

Uruchamia się, gdy bufory pamięci są pełne. Proszę spojrzeć na dokumenty, cały mechanizm jest wyjaśniony: http://nginx.org/r/proxy_max_temp_file_size

Możesz zwiększyć bufory pamięci.

VBart
źródło
5
W przypadku nr 1, w jaki sposób usunięcie limitu rozmiaru plików tymczasowych zapobiega ostrzeżeniu o buforowaniu? Nie sądzę, aby było to poprawne, ponieważ mam tę dyrektywę ustawioną na 0 i nadal otrzymuję ostrzeżenia.
Phil
Ta odpowiedź nie jest wystarczająco jasna, czy lepiej ustawić wydajność proxy_max_temp_file_sizena, 0czy to tylko sposób na usunięcie tego ostrzeżenia?
Offir Pe'er,
12

Poniższa konfiguracja działa dobrze na moim serwerze.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;
Haluk
źródło
2
Czy druga dyrektywa jest zbędna, tzn. Czy 16kw pierwszej linii robi dokładnie to samo co w drugiej linii?
EoghanM
1
@EoghanM zgodnie z dokumentami, nie. Proxy_Buffer_size (bufor, nie w liczbie mnogiej) dotyczy pierwszej części odpowiedzi serwera proxy (czyli nagłówków) Sets the size of the buffer used for reading the first part of the response received from the proxied server. This part usually contains a small response header. Bufory proxy służą do reszty odpowiedzi.
cde
2
Uratowałeś dziś niektóre moje włosy. Przenosiłem nginx z naszego serwera do kontenera dokującego i zaczął on NIESAMOWICIE powoli. To „naprawiło” to. Nie jestem pewien, czy wersja na naszym serwerze była domyślnie włączona, czy nie, ale ta w kontenerze zdecydowanie potrzebowała tych ustawień.
Krystian