限制請求速率
限制請求速率動作基於漏桶演算法控制請求處理速度。低於調節閾值的請求正常處理;速率進入調節區間後,請求會被延遲;達到拒絕閾值後,系統執行指定的拒絕動作。
適用場景
- 平滑突發流量,避免短時間內的大量請求壓垮上游服務。
- 限制爬蟲、介面輪詢、批次查詢等持續高頻訪問。
- 按客戶端、URI 或業務標識分別保護高成本介面。
如果需要限制固定時間視窗內的請求總數,而不需要對中間流量進行延遲,請使用限制請求數。
工作原理
OpenResty Edge 根據一個或多個關鍵字對請求分組,並分別計算每個分組的請求速率。漏桶演算法將進入調節區間的突發請求延遲處理,使輸出速率更加平穩;超過拒絕閾值的請求則執行拒絕動作。
配置方法
在目標應用的頁面規則中選擇 CC 攻擊防禦動作 > 限制請求速率。


引數說明
- 關鍵字:用於對請求分組並分別計算速率。預設使用客戶端 IP 地址,也可以組合 URI、URI 引數等關鍵字。選擇 URI 引數或 Cookie 時,還需要指定相應的引數或 Cookie 名稱。詳見關鍵字。
- 調節於:請求速率低於該值時不受限制;達到該值但尚未達到拒絕閾值時,請求將被延遲處理。
- 拒絕於:請求速率達到該值後,系統執行拒絕動作。
- 拒絕動作:達到拒絕條件後執行的操作。詳見拒絕動作。
調節閾值和拒絕閾值可以按每秒請求數或每分鐘請求數設定。兩個閾值設定為相同值時,不保留調節區間,達到該速率後將直接執行拒絕動作。
關鍵字

可選的關鍵字包括:
- 客戶端 IP 地址:例如
1.1.1.1。 - URI:例如
/openresty。 - URI 查詢引數:例如
/openresty?arg1=val1中的arg1。 - 請求 Cookie:例如
Cookie: c1=v1中的c1。 X-Forwarded-For中的第一個 IP 地址:例如X-Forwarded-For: 1.1.1.1, 1.1.1.2中的1.1.1.1。X-Forwarded-For中的最後一個 IP 地址:例如X-Forwarded-For: 1.1.1.1, 1.1.1.2中的1.1.1.2。- 指定的 HTTP 請求頭:例如
Host。 - 加密 Cookie:根據 OpenResty Edge 生成的加密 Cookie 區分客戶端。請求沒有攜帶加密 Cookie 時,系統需要回退到其他關鍵字,因此加密 Cookie 必須與其他關鍵字組合使用。
使用 X-Forwarded-For 前,應確保該請求頭由可信代理維護,不能由客戶端任意偽造。
拒絕動作
達到拒絕條件後,系統可以執行以下預設動作。預設動作為 返回錯誤頁。

- 關閉請求連線:立即終止與客戶端的連線,不再響應請求。
- 返回錯誤頁:返回錯誤頁面,預設狀態碼為 503。
- 完成 hCaptcha 驗證:要求客戶端透過 hCaptcha 挑戰。
- 完成 OpenResty Edge Captcha 驗證:使用 OpenResty Edge 的驗證碼系統驗證使用者。
- 重定向驗證:將請求重定向到驗證頁面,驗證通過後才能繼續訪問。
- JavaScript 挑戰:要求客戶端瀏覽器執行 JavaScript 程式碼,以區分瀏覽器和簡單的自動化程式。
- 私有訪問 Token:請求客戶端認證,沒有有效 Token 時執行配置的回退動作。
需要配置回退動作、必要的 頁面模板 和 清除時間(預設 60 秒)。詳見 私有訪問 Token。
此動作在 OpenResty Edge
26.9.1-1中首次引入。 - 標記為拒絕:僅將請求標記為拒絕,並繼續執行後續規則。此動作於 24.9.1-7 中首次引入。
- 封禁 IP 地址:在作業系統層面丟棄來源 IP 的所有資料包。此動作於 26.3.1-1 中首次引入。
配置示例
僅限制特定地區的請求
預設情況下,動作會對所有請求按客戶端 IP 地址計算速率。可以透過頁面規則條件縮小生效範圍。例如,將客戶端國家設定為 JP,可以僅對來自日本的請求執行該動作。

完成動作和條件設定後,建立規則併發布應用配置。

使用加密 Cookie 區分客戶端
加密 Cookie 應與其他關鍵字組合使用。以下配置同時選擇 客戶端 IP 地址 和 加密 Cookie,並將調節閾值和拒絕閾值設定為每分鐘 1 個請求。

儲存併發布配置:

第一次傳送測試請求時,請求尚未攜帶加密 Cookie,因此響應會透過 Set-Cookie 下發 _oredge_rl:
$ curl localhost -H 'Host: test.com' -I
HTTP/1.1 404 Not Found
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: _oredge_rl=G63GyXMjH89ClH7dgJgSAo+f7FbPVTD5KAdkLbnkjhw=; Path=/; Secure
Req-ID: 0000008000045ed343300002
攜帶該 Cookie 傳送第一個請求時,加密 Cookie 對應的計數尚未達到限制:
$ curl localhost -H 'Host: test.com' -I \
-H 'Cookie: _oredge_rl=G63GyXMjH89ClH7dgJgSAo+f7FbPVTD5KAdkLbnkjhw='
HTTP/1.1 404 Not Found
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Req-ID: 0000008000045ed343300003
在同一分鐘內再次攜帶相同 Cookie 傳送請求,將觸發限制並返回 503:
$ curl localhost -H 'Host: test.com' -I \
-H 'Cookie: _oredge_rl=G63GyXMjH89ClH7dgJgSAo+f7FbPVTD5KAdkLbnkjhw='
HTTP/1.1 503 Service Temporarily Unavailable
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Req-ID: 0000008000045ed343a80004
注意事項
- 閾值應高於正常業務峰值,並透過監控逐步調整。閾值過低會使正常突發請求進入延遲佇列或被拒絕。
- 組合關鍵字會改變統計粒度。只按 URI 統計會讓所有客戶端共享同一個速率額度;按“客戶端 IP 地址 + URI”統計則會為每個客戶端訪問每個 URI 分別計速。
- 只按客戶端 IP 地址計速時,共享 NAT 或代理後的使用者會共用額度。
- 驗證配置時,應分別測試低於調節閾值、進入調節區間、達到拒絕閾值和速率恢復後的行為。