原文連接:何曉東 博客nginx
前置條件:nginx 須要有ngx_http_limit_conn_module
和ngx_http_limit_req_module
模塊,可使用命令2>&1 nginx -V | tr ' ' '\n'|grep limit
檢查有沒有相應模塊,若是沒有請從新編譯安裝這兩個模塊。
測試版本爲:nginx版本爲1.15+git
1.使用 limit_conn_zone
指令定義密鑰並設置共享內存區域的參數(工做進程將使用此區域來共享密鑰值的計數器)。第一個參數指定做爲鍵計算的表達式。第二個參數 zone
指定區域的名稱及其大小:github
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
變量進行給定服務器鏈接數的限制:segmentfault
http { limit_conn_zone $server_name zone=servers:10m; server { limit_conn servers 1000; } }
速率限制可用於防止 DDoS,CC 攻擊,或防止上游服務器同時被太多請求淹沒。該方法基於 leaky bucket
漏桶算法,請求以各類速率到達桶並以固定速率離開桶。在使用速率限制以前,您須要配置 "漏桶" 的全局參數:瀏覽器
這些參數使用 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 地址的二進制表示。ide
可使用如下數據計算共享內存區域的最佳大小:$binary_remote_addr
IPv4 地址的值大小爲 4 個字節,64 位平臺上的存儲狀態佔用 128 個字節。所以,大約 16000 個 IP 地址的狀態信息佔用該區域的 1m 字節。測試
若是在 NGINX 須要添加新條目時存儲空間耗盡,則會刪除最舊的條目。若是釋放的空間仍然不足以容納新記錄,NGINX 將返回 503 Service Unavailable
狀態代碼,狀態碼可使用 limit_req_status
指令從新定義。ui
一旦該區域被設置,你可使用 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 請求限制部分文檔,稍微調整了一點語義。
大佬們,買點更多 知識 嗎?