Nginx upstream性能優化


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指令設置。

[ 編輯本段 ]   [ 回目錄 ]2.2      后端服務器的配置   

 

位置

參數名

默認值

Tomcat

Server.xml

Connector標簽下的maxKeepAliveRequests

100

Nginx

Server模塊

keepalive_requests

100

 

修改相應的值以適應Nginx Upstream的配置需求,如Nginx的keepalive_requests配置為20000。而在Tomcat中的maxKeepAliveRequests官方建議最大值是200,請根據實際需求測試結果來配置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM