天天看點

Nginx upstream性能優化1      目的2      介紹   

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,請根據實際需求測試結果來配置。

繼續閱讀