首頁  >  文章  >  運維  >  Nginx如何限制http資源請求

Nginx如何限制http資源請求

王林
王林轉載
2023-05-17 12:16:06982瀏覽

前置條件:nginx 需要有ngx_http_limit_conn_module 和ngx_http_limit_req_module 模組,可以使用指令2>&1 nginx -v | tr ' ' '\n'|grep limit 檢查有沒有對應模組,如果沒有請重新編譯安裝這兩個模組。

測試版本為:nginx版本為1.15

#限制連結數

#1.使用limit_conn_zone 指令定義金鑰並設定共享記憶體區域的參數(工作進程將使用此區域來共享金鑰值的計數器)。第一個參數指定作為鍵計算的表達式。第二個參數zone 指定區域的名稱及其大小:

limit_conn_zone $binary_remote_addr zone=addr:10m;

2.在location {} , server {} 或http {} 上下文中使用limit_conn 指令來套用限制,第一個參數為上面設定的共享記憶體區域名稱,第二個參數為每個key被允許的連結數:

location /download/ {
 limit_conn addr 1;
}

使用$binary_remote_addr 變數作為參數的時候,是基於ip 位址的限制,同樣可以使用$server_name 變量進行給定伺服器連線數的限制:

http {
 limit_conn_zone $server_name zone=servers:10m;

 server {
 limit_conn servers 1000;
 }
}

限制請求速率

#速率限制可用於防止ddos,cc 攻擊,或防止上游伺服器同時被太多請求淹沒。該方法基於 leaky bucket 漏桶演算法,請求以各種速率到達桶並以固定速率離開桶。在使用速率限制之前,您需要配置"漏桶" 的全域參數:

  • key - 用於區分一個客戶端與另一個客戶端的參數,通常是變數

  • shared memory zone - 保留這些金鑰狀態的區域的名稱和大小(即"漏桶")

  • rate - 每秒請求數( r/s)或每分鐘請求數(r/m)("漏桶排空")中指定的請求速率限制。每分鐘請求數用於指定小於每秒一個請求的速率。

這些參數使用 limit_req_zone 指令設定。該指令在http {} 層級定義- 這種方法允許應用不同的區域並請求溢出參數到不同的上下文:

http {
 #...

 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
}

使用此配置,將創建大小為10m 字節,名稱為one 的共享記憶體區域。此區域保存使用 $binary_remote_addr 變數設定的客戶端 ip 位址的狀態。請注意, $remote_addr 還包含客戶端的 ip 位址,而 $binary_remote_addr 保留更短的 ip 位址的二進位表示。

可以使用以下資料計算共享記憶體區域的最佳大小: $binary_remote_addr ipv4 位址的值大小為 4 個位元組,64 位元平台上的儲存狀態佔用 128 個位元組。因此,大約 16000 個 ip 位址的狀態資訊佔用該區域的 1m 位元組。

如果在 nginx 需要新增條目時儲存空間耗盡,則會刪除最舊的條目。如果釋放的空間仍然不足以容納新記錄,nginx 將傳回 503 service unavailable 狀態代碼,狀態碼可以使用 limit_req_status 指令重新定義。

一旦該區域被設置,你可以使用nginx 配置中的任何地方使用limit_req 指令限制請求速率,尤其是server {} , location {} 和http {} 上下文:

http {
 #...

 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

 server {
 #...

 location /search/ {
  limit_req zone=one;
 }
 }
}

使用如上配置,nginx 在/search/ 路由下將每秒鐘處理不超過1 個請求,延遲處理這些請求的方式是總速率不大於設定的速率。 nginx 將延遲處理此類請求,直到 "儲存區"(共用儲存區 one)已滿。對於到達完整儲存桶的請求,nginx 將回應 503 service unavailable 錯誤(當 limit_req_status 未自訂設定狀態碼時)。

限制寬頻

要限制每個連線的頻寬,請使用下列limit_rate 指令:

location /download/ {
 limit_rate 50k;
}

透過此設置,客戶端將能夠透過單一連線以最高50k/秒的速度下載內容。但是,客戶端可以開啟多個連線跳過此限制。因此,如果目標是阻止下載速度大於指定值,則連線數也應該受到限制。例如,每個 ip 位址一個連線(如果使用上面指定的共用記憶體區域):

location /download/ {
 limit_conn addr 1;
 limit_rate 50k;
}

要僅在客戶端下載一定數量的資料後施加限制,請使用該 limit_rate_after 指令。允許客戶端快速下載一定數量的資料(例如,檔案頭 - 電影索引)並限制下載其餘資料的速率(使用戶觀看電影而不是下載)可能是合理的。

limit_rate_after 500k;
limit_rate 20k;

以下範例顯示了用於限制連線數和頻寬的組合配置。允許的最大連接數設定為每個客戶端位址 5 個連接,這適用於大多數常見情況,因為現代瀏覽器通常一次最多打開 3 個連接。同時,提供下載的位置只允許一個連線:

http {
 limit_conn_zone $binary_remote_address zone=addr:10m

 server {
 root /www/data;
 limit_conn addr 5;

 location / {
 }

 location /download/ {
  limit_conn addr 1;
  limit_rate_after 1m;
  limit_rate 50k;
 }
 }
}

以上是Nginx如何限制http資源請求的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除