nginx網站限速限流配置——網站被頻繁攻擊,nginx上的設置limit_req和limit_conn


利用ngx_http_limit_req_module模塊,可根據鍵值(如ip)限制每分鍾的速率;

其實看官方的穩定比看百度查到的穩定,配置起來更明了。但是,官方給的說明,這里還是百度看到一些文章,摘錄一些,做些筆記,

關於limit_req和limit_conn的區別

what is the difference  between connection and request? 

  •  connection是連接,即常說的tcp連接,通過三次握手而建立的一個完整狀態機。建立一個連接,必須得要三次握手。
  • request是指請求,即http請求,tcp連接是有狀態的,而構建在tcp之上的http卻是無狀態的協議

通過打開一個網頁,然后通過wareshark可以看到,一個連接建立后(即三次握手后),在這個連接斷開之前(即四次揮手之前),會有很多的http request,這就是他們的區別:即一個連接的生命周期中,會存在一個或者多個請求,這是為了加快效率,避免每次請求都要三次握手建立連接,現在的HTTP/1.1協議都支持這種特性,叫做keepalive。

limit_conn_zone $binanry_remote_addr zone=conn_zone:1m;

limit_conn conn_zone 1;  

這樣的配配置,表明以ip為key,來限制每個ip訪問lmit.html文件時候,最多只能有一個在線,否則其余的都要返回不可用。

這種情況就是一個靜止狀態的計數可以實現,而無關乎多長時間。

舉個例子,如果你的這個連接一直不釋放,即使你通過這一個連接發送出再多的request請求,只要我能夠應付,那么我就幫你處理

但是,如果你只需要處理2個請求,但是這兩個請求是分別用兩個連接同時發送過來的,那么,我就只能處理其中一個,另外一個就不行。這就是他的區別。

limit_req_zone $binary_remtoe_addr zone=req_zone:1m rate=1r/s; #這里需要為共享內存配置一個速率rate,

limit_conn zone=req_zone;

表明:對於每個ip來說,處理請求的速度不超過每秒1個請求

可以看到這是個速度量(而上面的那個是數字量,速度和個數還是有直觀的區別的吧。。)

是同時發送出100個請求(不管是通過100個連接還是1個連接),只要你請求到底的速度超過每秒1個,那么我就會拒絕你。

對於與 burst,推薦閱讀:Nginx下limit_req模塊burst參數超詳細解析 https://blog.csdn.net/hellow__world/article/details/78658041

這里把其總結摘錄如下:

limit_req zone=req_zone;

嚴格依照在limti_req_zone中配置的rate來處理請求
超過rate處理能力范圍的,直接drop
表現為對收到的請求無延時

limit_req zone=req_zone burst=5;

依照在limti_req_zone中配置的rate來處理請求
同時設置了一個大小為5的緩沖隊列,在緩沖隊列中的請求會等待慢慢處理
超過了burst緩沖隊列長度和rate處理能力的請求被直接丟棄
表現為對收到的請求有延時

limit_req zone=req_zone burst=5 nodelay;

依照在limti_req_zone中配置的rate來處理請求
同時設置了一個大小為5的緩沖隊列,當請求到來時,會爆發出一個峰值處理能力,對於峰值處理數量之外的請求,直接丟棄
在完成峰值請求之后,緩沖隊列不能再放入請求。如果rate=10r/m,且這段時間內沒有請求再到來,則每6 s 緩沖隊列就能回復一個緩沖請求的能力,直到回復到能緩沖5個請求位置。

小伙伴對這個zone估計還是有一些疑問,有疑問可以在下面評論,大家一起討論,比如,有人可能會問,一個客服端占用5個,那么327680只能容納65536個客服端,那么第65537個客服端就會返回503錯誤

limit_conn_zone

語法:

Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
看上面的語法,limit_conn_zone只能用在http段,例如:

http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
server_name www.tomener.com tomener.com;
location / {
root /var/www/tomener;
index index.php index.html index.htm;
limit_conn addr 5; #是限制每個IP只能發起5個連接
limit_rate 100k; #限速為 100KB/秒
}
}
}


對於關系:
key => $binary_remote_addr #二進制的IP地址
name => addr #隨便取的一個名字,比如,你可以取成abc
size => 10m #空間大小,這里是10兆
一個二進制的ip地址在32位機器上占用32個字節,在64位機器上占用63個字節,那么10M可以存放多少呢,計算一下,10x1024x1024/32 = 327680,意思就是可以存放326780個ip地址(32位),64位可以存放163840個ip


1、key:鍵,可以說是一個規則,就是對客戶端連接的一個標識,比如上面用的是IP地址,比如我們可以用$query_string,例如:/index.php?mp=138944093953,那我們就可以根據mp的值來限制連接數,更多的nginx內置變量請查看http://nginx.org/en/docs/varindex.html

2、zone:共享內存空間,作用:保存每個key對應的連接數

3、size:共享內存空間大小,如1M、10M、100K
當共享內存空間被耗盡,服務器將會對后續所有的請求返回 503 (Service Temporarily Unavailable) 錯誤

limit_conn_log_level指令

Syntax: limit_conn_log_level info | notice | warn | error;
Default: limit_conn_log_level error;
Context: http, server, location
說明:當達到最大限制連接數后,記錄日志的等級。

limit_conn_status指令

Syntax: limit_conn_status code;
Default: limit_conn_status 503;
Context: http, server, location
說明:當超過限制后,返回的響應狀態碼,默認是503,現在你就知道上面為什么會返回503(Service Temporarily Unavailable)服務暫時不可用

例子:

1、同時限制ip和虛擬主機最大並發連接

http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
location / {
limit_conn perip 10;
limit_conn perserver 1000;
}
}
}

 

 

根據官方給出的:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

具體配置如下

http {
    ########################### 限速配置 ################################
limit_conn_log_level error;
limit_conn_status 503;
#limit_conn_zone $binary_remote_addr zone=one:1m;
#limit_conn_zone $server_name zone=perserver:1m;
# 定義一個名為allips的limit_req_zone用來存儲session,大小是10M內存,
# 以$binary_remote_addr 為key,限制平均每秒的請求為20個,
# 1M能存儲16000個狀態,rete的值必須為整數,
# 如果限制兩秒鍾一個請求,可以設置成30r/m ,其中$binary_remote_addr有時需要根據自己已有的log_format變量配置進行替換
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

#limit_req zone=perip burst=10;
# 限制客戶端並發連接數量為20, allow only one connection per an IP address at a time(每次). ;
#是限制每個IP只能發起20連接 (addr 要跟 limit_conn_zone 的變量對應)
limit_conn perip 15;
limit_conn perserver 15;
   ############################ web server #######################
include /etc/nginx/http/http_web.conf;

}

參考文章:

Nginx限制訪問速率和最大並發連接數模塊--limit (防范DDOS攻擊)  https://www.cnblogs.com/wjoyxt/p/6128183.html

 


免責聲明!

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



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