property_rate_limiting 防刷插件
1 nginx 【init phase】
1.1 配置插件優先級1000
PropertyRateLimitingHandler.PRIORITY = 1000
注意:priority值越大優先級越高,針對相同phase階段內的插件生效。
1.2 重寫access函數
插件處於【access phase】階段
2 此插件的處理邏輯
通過 提取器extractor從以下對象中提取關鍵參數項
- Query
- Header
- Cookie
- PostParams
- Host
- URI
- IP
- Method
用於標記請求,併為此請求記錄訪問次數,當具有某些特徵的請求達到單位時間內訪問次數限制的時候,既直接返回429(訪問次數太多)應答,不再轉發請求到後端服務。
注意:此插件的功能就在於標記請求,限制各個被標記請求單位時間(秒,分鐘,小時,天)的訪問次數;關鍵點就是此插件並不是達到訪問次數限制後,整個接口都限制,只是限制具有某些特徵參數的接口請求。
場景:結合公司saas業務,不同商家的前端訪問域名相同,通過不同的flag來來區分商家,可以將此flag作為關鍵參數標記不同商家的訪問請求,進而限制單位時間內的訪問速率,如一分鐘內訪問接口不超過10次,一天訪問總次數不超過5000次。
3 dashboard配置
3.1 啟用 property_rate_limiting插件
![orange(3)插件功能分析(property_rate_limiting)](http://p2.ttnews.xyz/loading.gif)
3.2 創建選擇器,選擇“自定義流量”
儘量不要用“全流量”,相率更高一些
![orange(3)插件功能分析(property_rate_limiting)](http://p2.ttnews.xyz/loading.gif)
3.3 提取 flag請求參數來標記請求
限制訪問頻率為1分鐘內10次,超過則返回 429。
4 代碼邏輯
- nginx.conf 配置文件中 http節,指定 lua_shared_dict property_rate_limiting 10M空間,用來本地存放記錄請求訪問次數。
- extractor提取的參數作為key,次數作為value存儲在property_rate_limiting中,在首次設置值的同時會指定過期時間,過期時間根據頻率限制的秒,分鐘,小時,還是天來區分,首次設置次數值的時候指定expire過期時間,之後則是更新。時間到了下一個週期時,會從新設定,上一個週期的值會因為過期自動被清理掉。
閱讀更多 架構演進 的文章