업스트림 응답은 임시 파일에 버퍼링됩니다.

업스트림 응답은 임시 파일에 버퍼링됩니다.

저는 다소 크고 느린(복잡한 데이터, 복잡한 프런트엔드) 웹 애플리케이션을 구축하고 역방향 프록시로 제공 RoR하고 있습니다 . 오류 로그를 보면 다음과 같은 항목이 꽤 많이 있습니다.Pumanginxnginx

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"

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

0으로 설정하는 것에 대해 알고 있지만 proxy_max_temp_file_size약간 어색한 것 같습니다(프록시가 버퍼링을 시도하지만 버퍼링할 파일이 없습니다... 어떻게 더 빠를 수 있습니까?).

내 질문은 다음과 같습니다

  1. [경고]를 제거하고 응답 버퍼링을 방지하려면 어떻게 해야 합니까? 끄는 것이 좋을까요 , 아니면 0으로 proxy_buffering설정하는 것이 좋을까요? proxy_max_temp_file_size왜?

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

  3. nginx기본적으로 켜져 proxy_buffering있는데 실제로 응답을 버퍼링하는 경우 경고를 표시하는 이유는 무엇 입니까?

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

TIA, ngw.

답변1

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

proxy_max_temp_file_size제거하려면 0으로 설정해야 합니다 . 지시문은 proxy_buffering경고와 직접적인 관련이 없습니다. 버퍼링을 전혀 중지하기 위해 이 기능을 끌 수 있지만 이는 일반적으로 권장되지 않습니다(필요하지 않은 경우).혜성).

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

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

또한보십시오:http://aosabook.org/en/nginx.html

  1. nginx가 기본적으로 Proxy_buffering을 켜고 실제로 응답을 버퍼링하면 사용자에게 [경고]하는 이유는 무엇입니까?

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

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

  1. 응답이 언제 해당 옵션을 트리거합니까? 응답을 제공하는 데 몇 초(몇 초?) 이상 걸리는 경우는 언제입니까? 이것이 구성 가능합니까?

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

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

답변2

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

proxy_buffers 16 16k;  
proxy_buffer_size 16k;

답변3

nginx sendfile 명령은 정적 콘텐츠에 대해 도움이 될 수 있습니다.

https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/

sendfile 활성화:

기본적으로 NGINX는 파일 전송 자체를 처리하고 파일을 보내기 전에 파일을 버퍼에 복사합니다. sendfile 지시문을 활성화하면 데이터를 버퍼에 복사하는 단계가 제거되고 한 파일 설명자에서 다른 파일 설명자로 데이터를 직접 복사할 수 있습니다. 하나의 빠른 연결이 작업자 프로세스를 완전히 점유하지 않도록 하려면 sendfile_max_chunk 지시어를 사용하여 단일 sendfile() 호출에서 전송되는 데이터 양을 제한할 수 있습니다(이 예에서는 1MB).

location /mp3 {
    sendfile           on;
    sendfile_max_chunk 1m;
    #...
}

답변4

nginx.conf 또는 virtual-host 구성 파일 컨텍스트에 이를 추가합니다(http,섬기는 사람,위치):

proxy_max_temp_file_size 10240m;
proxy_buffers 240 240k;
proxy_busy_buffers_size 240k;
proxy_buffer_size 240k;

상황에 따라 값을 설정할 수 있지만 서로 균형을 이루어야 합니다(버퍼 지시문에 다른 숫자를 사용하지 마십시오).

나는 같은 문제가 있으며 IO, SQL 및 PHP 프로세스가 길고 오랜 시간이 소요되는 스크립트에 대해 이러한 구성을 테스트했는데 제대로 작동합니다.

관련 정보