nginx 的限制鏈接模塊limit_zone與limit_req_zone

nginx 上有兩個限制鏈接的模塊一個是 limit_zone 另外一個是 limie_req_zone,兩個均可以限制鏈接,但具體有什麼不一樣呢?
下面是 nginx 官網上給的解釋
limit_req_zone
Limit frequency of connections from a client. 
This module allows you to limit the number of requests for a given session, or as a special case, with one address.
Restriction done using leaky bucket. 

limit_zone
Limit simultaneous connections from a client. 
This module makes it possible to limit the number of simultaneous connections for the assigned session or as a special case, from one address. 


按照字面的理解,lit_req_zone的功能是經過 令牌桶原理來限制 用戶的鏈接頻率,(這個模塊容許你去限制單個地址 指定會話或特殊須要 的請求數 )
而 limit_zone 功能是限制一個客戶端的併發鏈接數。(這個模塊能夠限制單個地址 的指定會話 或者特殊狀況的併發鏈接數)
一個是限制併發鏈接一個是限制鏈接頻率,表面上彷佛看不出來有什麼區別,那就看看實際的效果吧~~~
在個人測試機上面加上這兩個參數下面是個人部分配置文件
http{
limit_zone one  $binary_remote_addr  10m;
#limit_req_zone  $binary_remote_addr  zone=req_one:10m rate=1r/s;
server
{
 ......
limit_conn   one  1;
#limit_req   zone=req_one  burst=120;
......
}
    }


解釋一下 limit_zone one  $binary_remote_addr  10m;
這裏的 one 是聲明一個 limit_zone 的名字,$binary_remote_addr是替代 $remore_addr 的變量,10m 是會話狀態儲存的空間
limit_conn one 1 ,限制客戶端併發鏈接數量爲1
先測試 limit_zone 這個模塊
我找一臺機器 用ab 來測試一下 命令格式爲
ab -c 100 -t 10 http://192.168.6.26/test.php php

test.php 內容是phpinfo
看看日誌裏的訪問 node

看來也不必定能限制的住1秒鐘1個併發鏈接,(有網友跟我說這是由於測試的文件自己過小了纔會這樣,有時間必定測試一下),從日誌裏面能夠看得出來 除了幾個200之外其餘的基本都是503,多數併發訪問都被503了。
我又用ab多運行了一下子,發現另外一種狀況 nginx


彷佛隨着數量的增多效果也會發生一些變化,並非徹底達到模塊說明中的效果
看看當前的tcp鏈接數
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 29
FIN_WAIT1 152
FIN_WAIT2 2
ESTABLISHED 26
SYN_RECV 16


此次測試下 limit_req_zone,配置文件稍微改動一下
http{
#limit_zone one  $binary_remote_addr  10m;
limit_req_zone  $binary_remote_addr  zone=req_one:10m rate=1r/s;
server
{
 ......
#limit_conn   one  1;
limit_req   zone=req_one  burst=120;
......
}
    }

restart 一下 nginx
簡單說明一下, rate=1r/s 的意思是每一個地址每秒只能請求一次,也就是說根據令牌桶(通過網友冰冰的指正應該是漏桶原理)原理 burst=120 一共有120塊令牌,而且每秒鐘只新增1塊令牌,
120塊令牌發完後 多出來的那些請求就會返回503
測試一下
ab -c 100 -t 10 http://192.168.6.26/test.php
看看這時候的訪問日誌
session

確實是每秒請求一次,那多測試一下子呢?把時間從10秒增長到30秒 併發



這個時候應該是120 已經不夠用了,出現不少503,還有兩種狀況會出現,請看圖 tcp


這種狀況很像是 在隊列裏的一些請求得不到響應而超時了,但我不肯定是否是這種狀況。 測試


客戶端本身等不及斷開了,返回499
看看當前的tcp鏈接數
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 51
FIN_WAIT1 5
ESTABLISHED 155
SYN_RECV 12


雖然這樣會讓nginx 一秒鐘只處理一個請求,可是仍然會有不少還在隊列裏面等待處理,這樣也會佔用不少tcp鏈接,從上面那條命令的結果中就能看得出來。
若是這樣呢
limit_req   zone=req_one  burst=120 nodelay;
加上 nodelay以後超過 burst大小的請求就會直接 返回503,如圖 spa

也是每秒處理1個請求,但多出來的請求沒有象剛纔那樣等待處理,而是直接返回503。
當前的tcp鏈接
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 30
FIN_WAIT1 15
SYN_SENT 7
FIN_WAIT2 1
ESTABLISHED 40
SYN_RECV 37

已鏈接的數量比上面的少了一些
經過此次測試我發現 這兩種模塊都不能作到絕對的限制,但的確已經起到了很大的減小併發和限制鏈接的做用,在生產環境中具體用哪一種或者須要兩種在一塊兒使用就要看各自的需求了。 rest

相關文章
相關標籤/搜索