連接數限流模塊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多億)。