上游響應被緩衝到臨時檔案中

上游響應被緩衝到臨時檔案中

我有一個相當大且緩慢(複雜數據、複雜前端)的 Web 應用程式內建並作為反向代理提供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"

我很好奇,因為對於不同的用戶和不同的用戶交互,頁面不太可能保持相同,我不認為在磁碟上緩衝響應是必要/有用的。

我知道proxy_max_temp_file_size並將其設置為 0,但在我看來有點尷尬(我的代理嘗試緩衝,但沒有文件可以緩衝到...如何更快?)。

我的問題是:

  1. 如何刪除 [警告] 並避免緩衝響應?是關閉比較好proxy_buffering還是設定proxy_max_temp_file_size為0比較好?為什麼?

  2. 如果nginx緩衝響應:它何時提供緩衝響應、向誰提供以及為什麼?

  3. 為什麼預設nginx會打開proxy_buffering,然後如果它確實緩衝了回應,就會向您發出警告?

  4. 響應何時觸發該選項?當需要 > 幾秒(多少秒?)來提供反應?這是可配置的嗎?

TIA,NGW。

答案1

  1. 如何刪除 [警告] 並避免緩衝響應?關閉 proxy_buffering 或將 proxy_max_temp_file_size 設為 0 是否更好?為什麼?

您應該設為proxy_max_temp_file_size0 才能將其刪除。該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/

啟用發送文件:

預設情況下,NGINX 會自行處理檔案傳輸,並在發送之前將檔案複製到緩衝區中。啟用 sendfile 指令消除了將資料複製到緩衝區的步驟,並允許將資料從一個檔案描述符直接複製到另一個檔案描述符。為了防止一個快速連線完全佔用工作進程,您可以使用 sendfile_max_chunk 指令來限制單一 sendfile() 呼叫中傳輸的資料量(在本範例中為 1 MB):

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

答案4

將這些新增至 nginx.conf 或虛擬主機設定檔上下文(http,伺服器,地點):

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

您可以根據自己的情況設定這些值,但它們必須相互平衡(不要對緩衝區指令使用不同的數字)。

我有同樣的問題,並測試了這些配置的腳本與大量和長時間的 IO、SQL 和 php 進程,它工作正常。

相關內容