一.ngx_http_limit_conn_module
對同一個ip/server的連接數做限制.
配置指令:
limit_conn_zone
語法: limit_conn_zone $variable zone=name:size;
默認值: none
配置段: http
$veriable:常見取值
a.$binary_remote_addr 以客戶端ip作為key
b.$server_name 以server作為key
示例:
limit_conn_zone $binary_remote_addr zone=addr:10m;
以客戶端的ip地址做key,配置了一個名稱為addr的共享內存為10m空間的限制域.如果內存空間被耗盡,則返回503錯誤.
使用$binary_remote_addr變量, 可以將每條狀態記錄的大小減少到64個字節,這樣1M的內存可以保存大約1萬6千個64字節的記錄
當多個 limit_conn 指令被配置時,所有的連接數限制都會生效
http, server, location段配置:
limit_conn addr 4; #同一ip,同一時間,只允許有4個連接 limit_rate 200k;#每個連接的下載速度
二.ngx_http_limit_req_module
對同一個ip的請求數做限制
配置指令:
limit_req_zone
語法: limit_req_zone $variable zone=name:size rate=rate;
默認值: none
配置段: http
示例:
limit_req_zone $binary_remote_addr zone=limit:10m rate=1r/s;
說明:
以客戶端ip為key,建立了一個共享內存為10m的limit限制域.每秒可新增1個請求.
http, server, location段配置:
limit_req zone=limit burst=5; //漏桶原理,使用limit限制域限制的速率,每秒1個來處理請求,在處理未完成時,允許有5個請求放在緩存區,其余的請求都要等待.所以單個ip限制的最高峰值為5.
如果不希望這些請求等待,直接返回拒絕結果,加nodelay;則其余請求直接返回默認的503;
limit_req zone=limit burst=5 nodelay;
如果不加nodelay:
單個ip需要把並發在控制在burst限制內
如果加了nodelay:
單個ip不但需要把並發控制在burst內,而且不超出rate(速率)限制.
三.兩者的區別
1.limit_conn是針對連接,即tcp連接,通過三次握手而建立的一個完整狀態機制,來建立一個連接。(keep-alive的出現就是為了減少這種握手的次數,是同一連接可以復用.減少開銷)
2.limit_req是針對請求,即http請求.
打開一個網頁,圖文並茂的那種,通常瀏覽器可能同時建立1-4個連接(依據不同瀏覽器和傳輸協議和keep-alive等,實際有所不同),然后由這些連接來發出幾十個乃至上百個請求.
瀏覽器盡管同時能打開多個連接,但limit_conn限制了同時打開的連接個數.如同時只有1個,則其余的都需要等待.
連接打開后,就會盡快處理請求,比如返回文本或圖片;limit_req則限制了同一ip在同一時間內請求的速度.比如每秒1個,超過這個速率限制,都會等待或不處理.
如果配置了keep-alive,則一個連接可以處理很多個請求,只要這些請求在limit_req的限制下.
簡而言之,如果將web server比作游樂場,limit_conn限制了通道數目,有幾條;limit_req限制了每個通道,可以通行速度.
因為limit_conn限制了連接數,同時還可以限制下載速度,一般用作下載方面的限制.
limit_req則一般用作cc攻擊防護.