Nginx 作為反向代理優化要點proxy_buffering
https://blog.csdn.net/cymm_liu/article/details/76667153
當nginx用於反向代理時,每個客戶端將使用兩個連線:一個用於響應客戶端的請求,另一個用於到後端的訪問;
那麼,可以從如下配置起步:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# One worker per CPU-core.
worker_processes 2;
events {
worker_connections 8096;
multi_accept on;
use epoll;
}
worker_rlimit_nofile 40000;
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
}
標準的代理配置
下面是一個基本的反向代理配置模板,將所有請求都轉發給指定的後端應用。
例如,到http://your.ip:80/的請求都將重定向到 http://127.0.0.1:4433/ 私有伺服器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# One process for each CPU-Core
worker_processes 2;
# Event handler.
events {
worker_connections 8096;
multi_accept on;
use epoll;
}
http {
# Basic reverse proxy server
upstream backend {
server 127.0.0.1:4433;
}
# *:80 -> 127.0.0.1:4433
server {
listen 80;
server_name example.com;
## send all traffic to the back-end
location / {
proxy_pass http: //backend ;
proxy_redirect off;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
緩衝控制
如果禁止緩衝,那麼當Nginx一收到後端的反饋就同時傳給客戶端。
nginx 不會從被代理的伺服器讀取整個反饋資訊。
nginx可從伺服器一次接收的最大資料大小由 proxy_buffer_size 控制。
1
2
3
proxy_buffering off;
proxy_buffer_size 128k;
proxy_buffers 100 128k;
相關引數
proxy_buffer_size
語法: proxy_buffer_size the_size
預設值: proxy_buffer_size 4k/8k
上下文: http, server, location
該指令設定緩衝區大小,從代理後端伺服器取得的第一部分的響應內容,會放到這裡.小的響應header通常位於這部分響應內容裡邊.
預設來說,該緩衝區大小等於指令 proxy_buffers所設定的;但是,你可以把它設定得更小.
proxy_buffering
語法: proxy_buffering on|off
預設值: proxy_buffering on
上下文: http, server, location
這個引數用來控制是否開啟後端響應內容的緩衝區,如果這個設定為off,那麼proxy_buffers和proxy_busy_buffers_size這兩個指令將會失效。 但是無論proxy_buffering是否開啟,對proxy_buffer_size都是生效的。
proxy_buffering開啟的情況下,nignx會把後端返回的內容先放到緩衝區當中,然後再返回給客戶端(邊收邊傳,不是全部接收完再傳給客戶端)。 臨時檔案由proxy_max_temp_file_size和proxy_temp_file_write_size這兩個指令決定的。如果響應內容無法放在記憶體裡邊,那麼部分內容會被寫到磁碟上。
如果proxy_buffering關閉,那麼nginx會立即把從後端收到的響應內容傳送給客戶端,每次取的大小為proxy_buffer_size的大小,這樣效率肯定會比較低。
nginx不嘗試計算被代理伺服器整個響應內容的大小,nginx能從伺服器接受的最大資料,是由指令proxy_buffer_size指定的.
注:1、 proxy_buffering啟用時,要提防使用的代理緩衝區太大。這可能會吃掉你的記憶體,限制代理能夠支援的最大併發連線數。
2、對於基於長輪詢(long-polling)的Comet 應用來說,關閉 proxy_buffering 是重要的,不然非同步響應將被快取導致Comet無法工作
proxy_buffers
語法: proxy_buffers the_number is_size;
預設值: proxy_buffers 8 4k/8k;
上下文: http, server, location
該指令設定緩衝區的大小和數量,從被代理的後端伺服器取得的響應內容,會放置到這裡. 預設情況下,一個緩衝區的大小等於記憶體頁面大小,可能是4K也可能是8K,這取決於平臺。
proxy_buffers由緩衝區數量和緩衝區大小組成的。總的大小為number*size。
若某些請求的響應過大,則超過_buffers的部分將被緩衝到硬碟(緩衝目錄由_temp_path指令指定), 當然這將會使讀取響應的速度減慢, 影響使用者體驗. 可以使用proxy_max_temp_file_size指令關閉磁碟緩衝.
proxy_busy_buffers_size
語法: proxy_busy_buffers_size size;
預設值: proxy_busy_buffers_size proxy_buffer_size * 2;
上下文: http, server, location, if
proxy_busy_buffers_size不是獨立的空間,他是proxy_buffers和proxy_buffer_size的一部分。nginx會在沒有完全讀完後端響應的時候就開始向客戶端傳送資料,所以它會劃出一部分緩衝區來專門向客戶端傳送資料(這部分的大小是由proxy_busy_buffers_size來控制的,建議為proxy_buffers中單個緩衝區大小的2倍),然後它繼續從後端取資料,緩衝區滿了之後就寫到磁碟的臨時檔案中。
proxy_max_temp_file_size和proxy_temp_file_write_size
臨時檔案由proxy_max_temp_file_size和proxy_temp_file_write_size這兩個指令決定。 proxy_temp_file_write_size是一次訪問能寫入的臨時檔案的大小,預設是proxy_buffer_size和proxy_buffers中設定的緩衝區大小的2倍,Linux下一般是8k。
proxy_max_temp_file_size指定當響應內容大於proxy_buffers指定的緩衝區時, 寫入硬碟的臨時檔案的大小. 如果超過了這個值, Nginx將與Proxy伺服器同步的傳遞內容, 而不再緩衝到硬碟. 設定為0時, 則直接關閉硬碟緩衝.
總結:
buffer工作原理
首先第一個概念是所有的這些proxy buffer引數是作用到每一個請求的。每一個請求會安按照引數的配置獲得自己的buffer。proxy buffer不是global而是per request的。
proxy_buffering 是為了開啟response buffering of the proxied server,開啟後proxy_buffers和proxy_busy_buffers_size引數才會起作用。
無論proxy_buffering是否開啟,proxy_buffer_size(main buffer)都是工作的,proxy_buffer_size所設定的buffer_size的作用是用來儲存upstream端response的header。
在proxy_buffering 開啟的情況下,Nginx將會盡可能的讀取所有的upstream端傳輸的資料到buffer,直到proxy_buffers設定的所有buffer們被寫滿或者資料被讀取完(EOF)。此時nginx開始向客戶端傳輸資料,會同時傳輸這一整串buffer們。同時如果response的內容很大的話,Nginx會接收並把他們寫入到temp_file裡去。大小由proxy_max_temp_file_size控制。如果busy的buffer傳輸完了會從temp_file裡面接著讀資料,直到傳輸完畢。
一旦proxy_buffers設定的buffer被寫入,直到buffer裡面的資料被完整的傳輸完(傳輸到客戶端),這個buffer將會一直處在busy狀態,我們不能對這個buffer進行任何別的操作。所有處在busy狀態的buffer size加起來不能超過proxy_busy_buffers_size,所以proxy_busy_buffers_size是用來控制同時傳輸到客戶端的buffer數量的。
快取和過期控制
上面的配置是將所有請求都轉發給後端應用。為避免靜態請求給後端應用帶來的過大負載,我們可以將nginx配置為快取那些不變的響應資料。
這就意味著nginx不會向後端轉發那些請求。
下面示例,將 *.html, *.gif, 等檔案快取30分鐘。:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
http {
#
# The path we'll cache to.
#
proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache:60m max_size=1G;
}
## send all traffic to the back-end
location / {
proxy_pass http: //backend ;
proxy_redirect off;
proxy_set_header X-Forwarded-For $remote_addr;
location ~* \.(html|css|jpg|gif|ico|js)$ {
proxy_cache cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 301 302 30m;
expires 30m;
proxy_pass http: //backend ;
}
}
這裡,我們將請求快取到 /tmp/cache,並定義了其大小限制為1G。同時只允許快取有效的返回資料,例如:
1
proxy_cache_valid 200 301 302 30m;
所有響應資訊的返回程式碼不是 "HTTP (200|301|302) OK" 的都不會被快取。
對於例如workpress的應用,需要處理cookies 和快取的過期時間,通過只快取靜態資源來避免其帶來的問題。