限制請求速率

限制請求速率動作基於漏桶演算法控制請求處理速度。低於調節閾值的請求正常處理;速率進入調節區間後,請求會被延遲;達到拒絕閾值後,系統執行指定的拒絕動作。

適用場景

  • 平滑突發流量,避免短時間內的大量請求壓垮上游服務。
  • 限制爬蟲、介面輪詢、批次查詢等持續高頻訪問。
  • 按客戶端、URI 或業務標識分別保護高成本介面。

如果需要限制固定時間視窗內的請求總數,而不需要對中間流量進行延遲,請使用限制請求數

工作原理

OpenResty Edge 根據一個或多個關鍵字對請求分組,並分別計算每個分組的請求速率。漏桶演算法將進入調節區間的突發請求延遲處理,使輸出速率更加平穩;超過拒絕閾值的請求則執行拒絕動作。

配置方法

在目標應用的頁面規則中選擇 CC 攻擊防禦動作 > 限制請求速率

選擇限制請求速率動作

限制請求速率配置

引數說明

  1. 關鍵字:用於對請求分組並分別計算速率。預設使用客戶端 IP 地址,也可以組合 URI、URI 引數等關鍵字。選擇 URI 引數或 Cookie 時,還需要指定相應的引數或 Cookie 名稱。詳見關鍵字
  2. 調節於:請求速率低於該值時不受限制;達到該值但尚未達到拒絕閾值時,請求將被延遲處理。
  3. 拒絕於:請求速率達到該值後,系統執行拒絕動作。
  4. 拒絕動作:達到拒絕條件後執行的操作。詳見拒絕動作

調節閾值和拒絕閾值可以按每秒請求數或每分鐘請求數設定。兩個閾值設定為相同值時,不保留調節區間,達到該速率後將直接執行拒絕動作。

關鍵字

限制請求速率的關鍵字選項

可選的關鍵字包括:

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

使用加密 Cookie 作為關鍵字

儲存併發布配置:

釋出請求速率限制配置

第一次傳送測試請求時,請求尚未攜帶加密 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 或代理後的使用者會共用額度。
  • 驗證配置時,應分別測試低於調節閾值、進入調節區間、達到拒絕閾值和速率恢復後的行為。