
我有一個相當大且緩慢(複雜數據、複雜前端)的 Web 應用程式內建並作為反向代理提供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_size
並將其設置為 0,但在我看來有點尷尬(我的代理嘗試緩衝,但沒有文件可以緩衝到...如何更快?)。
我的問題是:
如何刪除 [警告] 並避免緩衝響應?是關閉比較好
proxy_buffering
還是設定proxy_max_temp_file_size
為0比較好?為什麼?如果
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/
啟用發送文件:
預設情況下,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 進程,它工作正常。