1,首先,limit_req和limit_conn兩個模塊都是為了來限流的,但是兩者不在一個層面,為了搞清楚這個,必須先要弄清楚request和connection的區別,因為在很多情況下,我們把他們混淆了。
so, what is the difference between connection and request?
2, connection是連接,即常說的tcp連接,通過三次握手而建立的一個完整狀態機。建立一個連接,必須得要三次握手。
request是指請求,即http請求,
(注意,tcp連接是有狀態的,而構建在tcp之上的http卻是無狀態的協議)。
通過打開一個網頁,然后通過wareshark可以看到,一個連接建立后(即三次握手后),在這個連接斷開之前(即四次揮手之前),會有很多的http request,這就是他們的區別:即一個連接的生命周期中,會存在一個或者多個請求,這是為了加快效率,避免每次請求都要三次握手建立連接,現在的HTTP/1.1協議都支持這種特性,叫做keepalive。
好了現在知道區別了。
3,那么在Nginx中,對於連接限制模塊:limit_conn_module來看:
limit_conn_zone $binanry_remote_addr zone=conn_zone:1m;
locoation /limit.html {
limit_conn conn_zone 1;
}
這樣的配配置,表明以ip為key,來限制每個ip訪問lmit.html文件時候,最多只能有一個在線,否則其余的都要返回不可用。
這種情況就是一個靜止狀態的計數可以實現,而無關乎多長時間。
舉個例子,如果你的這個連接一直不釋放,即使你通過這一個連接發送出再多的request請求,只要我能夠應付,那么我就幫你處理。但是,如果你只需要處理2個請求,但是這兩個請求是分別用兩個連接同時發送過來的,那么,我就只能處理其中一個,另外一個就不行。這就是他的區別。
可以用ab命令來測試:
ab -n100 -c100 -k http://yoursit/limit.html
注意:ab命令的-n -c都是指的發送多少請求,即-n一共發送多少請求,-c同時發送多少請求,他並不關心需要多少連接來發送,默認情況下是每個請求都建立一個連接來發送。
上面這個命令,由於默認是一個連接發送一個請求,那么這將會同時建立100個連接,而這樣的話,就會導致限制超過(最多只能一個連接for一個ip)。99個請求都會失敗。
而如果你只開一個連接:
ab -n100 -c100 -k http://yousit/limt.html
這里的-k選秀就是表示keepalive,只開一個連接來發送這100個請求,即使是同時發送,那么server也不會認為你超過了,因為在一個時間你只是建立一個連接,這樣這100個請求都會干凈利落的處理完成。
3,再看limit_req_module
limit_req_zone $binary_remtoe_addr zone=req_zone:1m rate=1r/s;
location /limit.html{
limit_conn zone=req_zone;
}
注意和上面的區別:這里需要為共享內存配置一個速率rate
表明:對於每個ip來說,處理請求的速度不超過每秒1個請求。
可以看到這是個速度量(而上面的那個是數字量,速度和個數還是有直觀的區別的吧。。)
那么這時候 :
ab -n100 -c100 http://yoursit/limit.html
和
ab -n100 -c100 -k http://yousit/limt.html
的區別就不是那么明顯了,因為這總是同時發送出100個請求(不管是通過100個連接還是1個連接),只要你請求到底的速度超過每秒1個,那么我就會拒絕你。
(完)
附加:https://forum.linode.com/viewtopic.php?t=8064%3E
--------------------- 作者:雷鋒不謝 來源:CSDN 原文:https://blog.csdn.net/u012566181/article/details/49968283?utm_source=copy 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!