連接數限流ngx_http_limit_conn_module和漏桶算法ngx_http_limit_req_module

連接數限流模塊ngx_http_limit_conn_module和漏桶算法實現的請求限流模塊ngx_http_limit_req_module

limit_req_zone $binary_remote_addr $uri zone=two:3m rate=1r/s;

表示當相同的ip地址並且訪問相同的uri,會導致進入limit req的限制(每秒1個請求)

limit_req_zone 用來限制單位時間內的請求數,即速率限制,採用的漏桶算法 “leaky bucket”

limit_req_conn 用來限制同一時間連接數,即併發限制

limit_req_conn模塊可以根據源IP限制單用戶併發訪問的連接數或連接到該服務的總併發連接數

limit_req_zone $binary_remote_addr zone=req10k:30m rate=10000r/s;

當區的大小爲1m的時候,大約可以記錄32000個會話信息(一個會話佔用 32 bytes)。

$binary_remote_addr”其表示IP地址,也可以使用如$server_name作爲KEY來限制域名級別的最大連接數;

limit_conn_status:配置被限流後返回的狀態碼,默認返回503;

limit_conn_log_level:配置記錄被限流後的日誌級別,默認error級別

server{

limit_conn one 1 ,限制客戶端併發連接數量爲1, allow only one connection per an IP address at a time

}

lit_req_zone的功能是通過漏桶原理來限制用戶的連接頻率,(這個模塊允許你去限制單個地址指定會話或特殊需要的請求數 )

而 limit_zone 功能是限制一個客戶端的併發連接數。(這個模塊可以限制單個地址的指定會話或者特殊情況的併發連接數)

按照域名限制併發連接數配置示例,接着在要限流的location中添加限流邏輯配合limit_conn使用(控制每個域名最大併發請求連接數):

limit_conn_zone $ server_name zone=perserver:10m;

如果配置了桶容量(burst>0)且延遲模式(沒有配置nodelay);如果桶滿了,則新進入的請求被限流;如果沒有滿則請求會以固定平均速率被處理(按照固定速率並根據需要延遲處理請求,延遲使用休眠實現);

如果配置了桶容量(burst>0)且非延遲模式(配置了nodelay)不會按照固定速率處理請求,而是允許突發處理請求;如果桶滿了,則請求被限流,直接返回相應的錯誤碼;

 

cc 攻擊超過策略Qps上報日誌到syslog server,離線腳本統計上報日誌,保存數據庫。

將qps字段+domain+當前時間作爲key,會基於時間在redis產生大量的節點,時間維度分散不利於統計,且redis節點expire時間如果設置的比較小,統計不當造成遺漏。

所以統計QPS採取平均手段,根據根據domain生成redis節點,記錄3分鐘內cc攻擊QPS。

 

Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象。

Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章