업스트림 응답이 임시 파일로 버퍼링 됨


61

나는 오히려 크고 느린 (복잡한 데이터, 복잡한 프론트 엔드) 웹 응용 프로그램의 구축이 RoR에 의해 제공 Puma과 nginx같은 역방향 프록시를. nginx오류 로그를 보면 다음과 같은 몇 가지 항목이 있습니다.

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"

페이지가 다른 사용자와 다른 사용자 상호 작용에 대해 동일하게 유지 될 가능성이 거의 없기 때문에 다소 궁금합니다. 디스크에서 응답을 버퍼링하는 것이 필요 / 유용하다고 생각하지 않습니다.

나는 그것을 알고 proxy_max_temp_file_size0으로 설정하지만 조금 어색해 보입니다 (프록시는 버퍼링하려고하지만 버퍼링 할 파일이 없습니다 ... 어떻게 더 빠를 수 있습니까?).

내 질문은 :

  1. [경고]를 제거하고 버퍼링 응답을 피하려면 어떻게해야합니까? 끄 proxy_buffering거나 proxy_max_temp_file_size0 으로 설정 하는 것이 더 낫 습니까? 왜?

  2. nginx응답을 버퍼링하는 경우 : 버퍼링 된 응답을 언제, 누구에게, 왜 제공합니까?

  3. 왜 기본적 nginx으로 proxy_buffering켜져 있고 실제로 응답을 버퍼링하면 [경고]합니까?

  4. 응답이 언제 해당 옵션을 트리거합니까? 응답을 제공하는 데 몇 초 (얼마나 많은 시간)가 걸립니까? 이 구성 가능합니까?

TIA, NWG.


1
버퍼링과 캐싱을 혼동하는 느낌이 듭니다. 버퍼링은 메모리 할당에서 허용하는 것보다 많은 데이터를로드 할 수있는 절차입니다.
— 슬라브

답변:


75

1) 어떻게 [경고]를 제거하고 버퍼링 응답을 피할 수 있습니까? proxy_buffering을 끄거나 proxy_max_temp_file_size를 0으로 설정하는 것이 더 낫습니까? 왜?

proxy_max_temp_file_size제거하려면 0으로 설정해야 합니다. proxy_buffering지시어 직접 경고 관련이 없습니다. 버퍼링을 중지하기 위해 스위치를 끌 수는 있지만 일반적으로 권장되지는 않습니다 ( Comet에 필요하지 않은 경우 ).

2) nginx가 언제 버퍼링 된 응답을 제공 할 때 응답을 버퍼링하면 누구에게, 왜?

즉시 서버이지만 클라이언트는 일반적으로 연결 속도가 훨씬 느리며 응용 프로그램에서 생성 한 속도만큼 응답 데이터를 사용할 수 없습니다. Nginx는 애플리케이션을 최대한 빨리 릴리스하기 위해 전체 응답을 버퍼링하려고합니다.

참조 : http://aosabook.org/en/nginx.html

3) 왜 nginx가 기본적으로 proxy_buffering을 켠 다음 실제로 응답을 버퍼링하면 [경고]합니까?

이미 언급했듯이 proxy_buffering경고와 직접 관련이 없습니다. 일반적으로 최적화 된 프록시 작업에 필요하며이를 끄면 성능과 처리량이 저하됩니다.

Nginx는 응답이 구성된 메모리 버퍼에 맞지 않을 때만 경고합니다. 괜찮다면 경고를 무시해도됩니다.

4) 응답이 언제 해당 옵션을 트리거합니까? 응답을 제공하는 데 몇 초 이상 걸리는 경우 (얼마나 많은가?)? 이 구성 가능합니까?

메모리 버퍼가 가득 차면 트리거됩니다. 문서를 살펴보십시오. 전체 메커니즘이 설명되어 있습니다 : http://nginx.org/r/proxy_max_temp_file_size

메모리 버퍼를 늘릴 수 있습니다.


5
# 1의 경우 임시 파일의 크기 제한을 제거하면 버퍼링 경고가 어떻게 방지됩니까? 이 지시문을 0으로 설정했지만 경고 메시지가 표시되므로 이것이 올바른 것으로 생각하지 않습니다.
— Phil

성능은 설정하기이 답변이 충분히 명확하지, 그것은 더 나은 proxy_max_temp_file_size에 0또는이 아니라 경고를 제거하는 방법?
— Offir Pe'er

12

다음 구성은 서버에서 제대로 작동합니다.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;

2
두 번째 지시문이 중복되어 있습니까, 즉 16k첫 번째 행 의 두 번째 지시문이 두 번째 행과 정확히 같은 작업을 수행합니까?
— EoghanM

1
문서에 따라 @EoghanM. Proxy_Buffer_size (복수가 아닌 버퍼)는 프록시 서버 응답의 첫 번째 부분 (일명 헤더)에 적용 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됩니다. Proxy_buffers는 나머지 응답을위한 것입니다.
— cde

2
오늘 내 머리카락 일부를 구하셨습니다. 나는 nginx를 서버에서 도커 컨테이너로 옮기고 있었고 매우 느리게 시작했습니다. 이것은 그것을 "고정"했다. 서버의 버전이 기본적으로 켜져 있는지 확실하지 않지만 컨테이너의 버전에는 이러한 설정이 필요했습니다.
— Krystian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.