
저는 다소 크고 느린(복잡한 데이터, 복잡한 프런트엔드) 웹 애플리케이션을 구축하고 역방향 프록시로 제공 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"
다른 사용자와 다른 사용자 상호 작용에 대해 페이지가 동일하게 유지될 가능성이 거의 없기 때문에 오히려 궁금합니다. 디스크에 응답을 버퍼링하는 것이 필요하거나 유용하다고 생각하지 않습니다.
0으로 설정하는 것에 대해 알고 있지만 proxy_max_temp_file_size
약간 어색한 것 같습니다(프록시가 버퍼링을 시도하지만 버퍼링할 파일이 없습니다... 어떻게 더 빠를 수 있습니까?).
내 질문은 다음과 같습니다
[경고]를 제거하고 응답 버퍼링을 방지하려면 어떻게 해야 합니까? 끄는 것이 좋을까요 , 아니면 0으로
proxy_buffering
설정하는 것이 좋을까요?proxy_max_temp_file_size
왜?응답을 버퍼링하는 경우
nginx
: 버퍼링된 응답을 언제, 누구에게, 왜 제공합니까?nginx
기본적으로 켜져proxy_buffering
있는데 실제로 응답을 버퍼링하는 경우 경고를 표시하는 이유는 무엇 입니까?응답이 언제 해당 옵션을 트리거합니까? 응답을 제공하는 데 몇 초(얼마나?)가 걸리나요? 이것이 구성 가능합니까?
TIA, ngw.
답변1
- [경고]를 제거하고 응답 버퍼링을 방지하려면 어떻게 해야 합니까? Proxy_buffering을 끄거나 Proxy_max_temp_file_size를 0으로 설정하는 것이 더 낫습니까? 왜?
proxy_max_temp_file_size
제거하려면 0으로 설정해야 합니다 . 지시문은 proxy_buffering
경고와 직접적인 관련이 없습니다. 버퍼링을 전혀 중지하기 위해 이 기능을 끌 수 있지만 이는 일반적으로 권장되지 않습니다(필요하지 않은 경우).혜성).
- nginx가 응답을 버퍼링하는 경우 언제 버퍼링된 응답을 제공합니까? 누구에게, 왜 제공됩니까?
즉시 응답을 제공하지만 클라이언트는 일반적으로 연결 속도가 훨씬 느리고 애플리케이션에서 생성되는 속도만큼 빠르게 응답 데이터를 사용할 수 없습니다. Nginx는 애플리케이션을 최대한 빨리 출시하기 위해 전체 응답을 버퍼링하려고 시도합니다.
또한보십시오:http://aosabook.org/en/nginx.html
- nginx가 기본적으로 Proxy_buffering을 켜고 실제로 응답을 버퍼링하면 사용자에게 [경고]하는 이유는 무엇입니까?
이미 언급했듯이 이는 proxy_buffering
경고와 직접적인 관련이 없습니다. 일반적으로 최적화된 프록시 작업에 필요하며 이를 끄면 성능과 처리량이 저하됩니다.
Nginx는 응답이 구성된 메모리 버퍼에 맞지 않는 경우에만 경고합니다. 괜찮다면 경고를 무시해도 됩니다.
- 응답이 언제 해당 옵션을 트리거합니까? 응답을 제공하는 데 몇 초(몇 초?) 이상 걸리는 경우는 언제입니까? 이것이 구성 가능합니까?
메모리 버퍼가 가득 차면 트리거됩니다. 문서를 살펴보세요. 전체 메커니즘이 설명되어 있습니다.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 프로세스가 길고 오랜 시간이 소요되는 스크립트에 대해 이러한 구성을 테스트했는데 제대로 작동합니다.