1 目的
完成基於大報文和小報文場景的Nginx壓測方案設計,其在長連接和短連接的最佳並發模型測試結果如下表:
大報文在短連接場景QPS在1.8K左右,在長連接場景QPS在2.1K左右,提升16.5%;
小報文在短連接場景QPS在5.6K左右,在長連接場景QPS在11.8K左右,提升一倍;
業務場景 |
Nginx到后端 |
並發量 |
QPS |
CPU(%) |
帶寬(M) |
PPS |
大報文 |
短連接 |
800 |
1855 |
61.31 |
763.48 |
142425.46 |
大報文 |
長連接 |
800 |
2162 |
66.74 |
881.56 |
133334.1 |
小報文 |
短連接 |
800 |
5678 |
43.35 |
117.64 |
104862.72 |
小報文 |
長連接 |
800 |
11808 |
60.55 |
226.45 |
151743.24 |
2 介紹
在nginx的模塊中,分為3種類型,分別是handler,filter和upstream,其中upstream可以看做一種特殊的handler,它主要用來實現和后端另外的服務器(php/jboss等)進行通信,由於在nginx中全部都是使用非阻塞,並且是一個流式的處理,所以upstream的實現很復雜。
upstream顧名思義,真正產生內容的地方在”上游”而不是nginx,也就是說nginx是位於client和后端的upstream之間的橋梁,在這種情況下,一個upstream需要做的事情主要有2個,第一個是當client發送http請求過來之后,需要創建一個到后端upstream的請求。第二個是當后端發送數據過來之后,需要將后端upstream的數據再次發送給client。
2.1 Nginx Upstream連接后端有兩種方式:短連接和長連接。
Keep-Alive即俗稱的長連接,使客戶端到服務端建立的連接持續有效,當對服務器發起后續請求時,Keep-Alive功能可以復用先前使用過的連接,減少了重新建立連接所需的開銷。通常使用HTTP協議采用的是請求應答模式,客戶端到服務端的一次請求完成了,它們之間的連接也隨之關閉。在某些應用場景下,比如后端RESTful服務,就需要保持住連接,這時就可以啟用HTTP Keep-Alive。Nginx長連接的配置:
upstream backend-others { server 10.x.x.x max_fails=0 fail_timeout=10s; server 10.x.x.x:81 max_fails=0 fail_timeout=10s; keepalive 20000; }
location / { #防止502以及Timeout的發生 proxy_connect_timeout 75; proxy_read_timeout 300; proxy_send_timeout 300; proxy_buffer_size 64k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k;
proxy_http_version 1.1; proxy_set_header Connection ""; proxy_pass http://backend-others; } |
1 server
定義服務器的地址address和其他參數parameters。 地址可以是域名或者IP地址,端口是可選的,或者是指定“unix:”前綴的UNIX域套接字的路徑。如果沒有指定端口,就使用80端口。 如果一個域名解析到多個IP,本質上是定義了多個server。還可以定義下面的參數:
1) weight=number 設定服務器的權重,默認是1。
2) max_fails=number 設定Nginx與服務器通信的嘗試失敗的次數。在fail_timeout參數定義的時間段內,如果失敗的次數達到此值,Nginx就認為服務器不可用。在下一個fail_timeout時間段,服務器不會再被嘗試。 失敗的嘗試次數默認是1。設為0就會停止統計嘗試次數,認為服務器是一直可用的。你可以通過指令proxy_next_upstream、 fastcgi_next_upstream和 memcached_next_upstream來配置什么是失敗的嘗試。 默認配置時,http_404狀態不被認為是失敗的嘗試。
3) fail_timeout=time 設定統計失敗嘗試次數的時間段。在這段時間中,服務器失敗次數達到指定的嘗試次數,服務器就被認為不可用。服務器被認為不可用的時間段。默認情況下,該超時時間是10秒。
4) Backup 標記為備用服務器。當主服務器不可用以后,請求會被傳給這些服務器。
5) Down 標記服務器永久不可用,可以跟ip_hash指令一起使用。
2 默認的是RR輪詢。
3 ip_hash
指定服務器組的負載均衡方法,請求基於客戶端的IP地址在服務器間進行分發。 IPv4地址的前三個字節或者IPv6的整個地址,會被用來作為一個散列key。 這種方法可以確保從同一個客戶端過來的請求,會被傳給同一台服務器。除了當服務器被認為不可用的時候,這些客戶端的請求會被傳給其他服務器,而且很有可能也是同一台服務器。可以解決session和cookie的問題,但會導致負載不均衡。
4 keepalive
激活對上游服務器的連接進行緩存。connections參數設置每個worker進程與后端服務器保持連接的最大數量。這些保持的連接會被放入緩存。如果連接數大於這個值時,最久未使用的連接會被關閉。需要注意的是,keepalive指令不會限制Nginx進程與上游服務器的連接總數。 新的連接總會按需被創建。connections參數應該稍微設低一點,以便上游服務器也能處理額外新進來的連接。
1) 對於HTTP代理,proxy_http_version指令應該設置為“1.1”,同時“Connection”頭的值也應被清空。
2) 另外一種選擇是,HTTP/1.0協議的持久連接也可以通過發送“Connection: Keep-Alive”頭來實現。不過不建議這樣用。
3) 對於FastCGI的服務器,需要設置 fastcgi_keep_conn 指令來讓連接keepalive工作。當使用的負載均衡方法不是默認的輪轉法時,必須在keepalive 指令之前配置。
5 proxy_connect_timeout
默認是60s,設置與后端服務器建立連接的超時時間。應該注意這個超時一般不可能大於75秒。
proxy_read_timeout默認60s,定義從后端服務器讀取響應的超時。此超時是指相鄰兩次讀操作之間的最長時間間隔,而不是整個響應傳輸完成的最長時間。如果后端服務器在超時時間段內沒有傳輸任何數據,連接將被關閉。
6 proxy_send_timeout
默認60s, 定義向后端服務器傳輸請求的超時。此超時是指相鄰兩次寫操作之間的最長時間間隔,而不是整個請求傳輸完成的最長時間。如果后端服務器在超時時間段內沒有接收到任何數據,連接將被關閉。
7 proxy_buffer_size
設置緩沖區的大小為size。nginx從被代理的服務器讀取響應時,使用該緩沖區保存響應的開始部分。這部分通常包含着一個小小的響應頭。該緩沖區大小默認等於proxy_buffers指令設置的一塊緩沖區的大小,但它也可以被設置得更小。
8 proxy_buffers為每個連接設置緩沖區的數量為number,每塊緩沖區的大小為size。這些緩沖區用於保存從被代理的服務器讀取的響應。每塊緩沖區默認等於一個內存頁的大小。這個值是4K還是8K,取決於平台。
9 proxy_busy_buffers_size
當開啟緩沖響應的功能以后,在沒有讀到全部響應的情況下,寫緩沖到達一定大小時,nginx一定會向客戶端發送響應,直到緩沖小於此值。這條指令用來設置此值。 同時,剩余的緩沖區可以用於接收響應,如果需要,一部分內容將緩沖到臨時文件。該大小默認是proxy_buffer_size和proxy_buffers指令設置單塊緩沖大小的兩倍。
10 proxy_temp_file_write_size
在開啟緩沖后端服務器響應到臨時文件的功能后,設置nginx每次寫數據到臨時文件的size(大小)限制。 size的默認值是proxy_buffer_size指令和proxy_buffers指令定義的每塊緩沖區大小的兩倍, 而臨時文件最大容量由proxy_max_temp_file_size指令設置。
2.2 后端服務器的配置
|
位置 |
參數名 |
默認值 |
Tomcat |
Server.xml |
Connector標簽下的maxKeepAliveRequests |
100 |
Nginx |
Server模塊 |
keepalive_requests |
100 |
修改相應的值以適應Nginx Upstream的配置需求,如Nginx的keepalive_requests配置為20000。而在Tomcat中的maxKeepAliveRequests官方建議最大值是200,請根據實際需求測試結果來配置。
upstream backend-others { server 10.123.73.242:81 max_fails=0 fail_timeout=10s; server 10.123.73.244:81 max_fails=0 fail_timeout=10s; server 10.123.73.245:81 max_fails=0 fail_timeout=10s; server 10.123.73.246:81 max_fails=0 fail_timeout=10s; server 10.123.73.248:81 max_fails=0 fail_timeout=10s; server 10.123.73.249:81 max_fails=0 fail_timeout=10s; server 10.123.73.247:81 max_fails=0 fail_timeout=10s; keepalive 20000; }
location / { #防止502以及Timeout的發生 proxy_connect_timeout 75; proxy_read_timeout 300; proxy_send_timeout 300; proxy_buffer_size 64k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k;
proxy_http_version 1.1; proxy_set_header Connection ""; proxy_pass http://backend-others; } |
1 server定義服務器的地址address和其他參數parameters。 地址可以是域名或者IP地址,端口是可選的,或者是指定“unix:”前綴的UNIX域套接字的路徑。如果沒有指定端口,就使用80端口。 如果一個域名解析到多個IP,本質上是定義了多個server。還可以定義下面的參數:
1) weight=number 設定服務器的權重,默認是1。
2) max_fails=number 設定Nginx與服務器通信的嘗試失敗的次數。在fail_timeout參數定義的時間段內,如果失敗的次數達到此值,Nginx就認為服務器不可用。在下一個fail_timeout時間段,服務器不會再被嘗試。 失敗的嘗試次數默認是1。設為0就會停止統計嘗試次數,認為服務器是一直可用的。你可以通過指令proxy_next_upstream、 fastcgi_next_upstream和 memcached_next_upstream來配置什么是失敗的嘗試。 默認配置時,http_404狀態不被認為是失敗的嘗試。
3) fail_timeout=time 設定統計失敗嘗試次數的時間段。在這段時間中,服務器失敗次數達到指定的嘗試次數,服務器就被認為不可用。服務器被認為不可用的時間段。默認情況下,該超時時間是10秒。
4) Backup 標記為備用服務器。當主服務器不可用以后,請求會被傳給這些服務器。
5) Down 標記服務器永久不可用,可以跟ip_hash指令一起使用。
2 默認的是RR輪詢。
3 ip_hash指定服務器組的負載均衡方法,請求基於客戶端的IP地址在服務器間進行分發。 IPv4地址的前三個字節或者IPv6的整個地址,會被用來作為一個散列key。 這種方法可以確保從同一個客戶端過來的請求,會被傳給同一台服務器。除了當服務器被認為不可用的時候,這些客戶端的請求會被傳給其他服務器,而且很有可能也是同一台服務器。可以解決session和cookie的問題,但會導致負載不均衡。
4 keepalive激活對上游服務器的連接進行緩存。connections參數設置每個worker進程與后端服務器保持連接的最大數量。這些保持的連接會被放入緩存。如果連接數大於這個值時,最久未使用的連接會被關閉。需要注意的是,keepalive指令不會限制Nginx進程與上游服務器的連接總數。 新的連接總會按需被創建。connections參數應該稍微設低一點,以便上游服務器也能處理額外新進來的連接。
1) 對於HTTP代理,proxy_http_version指令應該設置為“1.1”,同時“Connection”頭的值也應被清空。
2) 另外一種選擇是,HTTP/1.0協議的持久連接也可以通過發送“Connection: Keep-Alive”頭來實現。不過不建議這樣用。
3) 對於FastCGI的服務器,需要設置 fastcgi_keep_conn 指令來讓連接keepalive工作。當使用的負載均衡方法不是默認的輪轉法時,必須在keepalive 指令之前配置。
5 proxy_connect_timeout 默認是60s,設置與后端服務器建立連接的超時時間。應該注意這個超時一般不可能大於75秒。
proxy_read_timeout默認60s,定義從后端服務器讀取響應的超時。此超時是指相鄰兩次讀操作之間的最長時間間隔,而不是整個響應傳輸完成的最長時間。如果后端服務器在超時時間段內沒有傳輸任何數據,連接將被關閉。
6 proxy_send_timeout默認60s, 定義向后端服務器傳輸請求的超時。此超時是指相鄰兩次寫操作之間的最長時間間隔,而不是整個請求傳輸完成的最長時間。如果后端服務器在超時時間段內沒有接收到任何數據,連接將被關閉。
7 proxy_buffer_size設置緩沖區的大小為size。nginx從被代理的服務器讀取響應時,使用該緩沖區保存響應的開始部分。這部分通常包含着一個小小的響應頭。該緩沖區大小默認等於proxy_buffers指令設置的一塊緩沖區的大小,但它也可以被設置得更小。
8 proxy_buffers為每個連接設置緩沖區的數量為number,每塊緩沖區的大小為size。這些緩沖區用於保存從被代理的服務器讀取的響應。每塊緩沖區默認等於一個內存頁的大小。這個值是4K還是8K,取決於平台。
9 proxy_busy_buffers_size當開啟緩沖響應的功能以后,在沒有讀到全部響應的情況下,寫緩沖到達一定大小時,nginx一定會向客戶端發送響應,直到緩沖小於此值。這條指令用來設置此值。 同時,剩余的緩沖區可以用於接收響應,如果需要,一部分內容將緩沖到臨時文件。該大小默認是proxy_buffer_size和proxy_buffers指令設置單塊緩沖大小的兩倍。
10 proxy_temp_file_write_size在開啟緩沖后端服務器響應到臨時文件的功能后,設置nginx每次寫數據到臨時文件的size(大小)限制。 size的默認值是proxy_buffer_size指令和proxy_buffers指令定義的每塊緩沖區大小的兩倍, 而臨時文件最大容量由proxy_max_temp_file_size指令設置。
|
位置 |
參數名 |
默認值 |
Tomcat |
Server.xml |
Connector標簽下的maxKeepAliveRequests |
100 |
Nginx |
Server模塊 |
keepalive_requests |
100 |
修改相應的值以適應Nginx Upstream的配置需求,如Nginx的keepalive_requests配置為20000。而在Tomcat中的maxKeepAliveRequests官方建議最大值是200,請根據實際需求測試結果來配置。