nginx的限流功能
一般在情況下,我們的專案首頁併發量是非常大的,特別是使用者網路卡頓時,會不停的重新整理頁面導致有大量的無效請求,這樣會對系統造成很大的影響。
因此限流操作就是很有必要的,當請求達到一定的併發數或速率,就進行等待、排隊、降級、拒絕服務等。今天我們主要來看看nginx提供的限流方案
一、控制速率
1.什麼是控制速率
nginx提供的第一種限流方式是控制速率限流,在一定的時間內只處理特定數量的請求。nginx是採用漏桶演算法實現控制速率限流:
漏桶(Leaky Bucket)演算法思路很簡單,水(請求)先進入到漏桶裡,漏桶以一定的速度出水(介面有響應速率),當水流入速度過大會直接溢位(訪問頻率超過介面響應速率),然後就拒絕請求,可以看出漏桶演算法能強行限制資料的傳輸速率.示意圖如下
2.nginx具體配置
nginx的配置檔案如下:
http {
include mime.types;
default_type application/octet-stream;
limit_req_zone $binary_remote_addr zone=testRateLimit:10m rate=2r/s;
server { listen 80; server_name localhost; location /test_content { limit_req zone=contentRateLimit burst=4 nodelay; } } }
可以看到nginx中是對text_content的請求進行攔截並做限流配置
(1)限流的配置:limit_req_zone key zone rate
key:定義限流物件, binary_remote_addr,是基於 remote_addr(客戶端IP) 來做限流,binary_ 開頭的目的是壓縮記憶體佔用量
zone:定義共享記憶體區來儲存訪問資訊,testRateLimit:10m表示一個大小為10M,名字為testRateLimit的記憶體區域。1M能儲存16000 IP地址的訪問資訊,10M可以儲存16W IP地址訪問資訊
rate:用於設定最大訪問速率,rate=2r/s 表示每秒最多處理2個請求。Nginx 實際上以毫秒為粒度來跟蹤請求資訊,因此 2r/s 實際上是限制:每100毫秒處理兩個請求。這意味著,自上一個請求處理完後,若後續100毫秒內又有請求到達,將拒絕處理該請求。
(2)突發流量
上面例子限制 2r/s,如果有時正常流量突然增大,超出的請求將被拒絕,無法處理突發流量,可以結合burst引數使用來解決該問題:
limit_req zone=contentRateLimit burst=4 nodelay;
burst=4nodelay表示:平均每秒允許不超過2個請求,突發不超過4個請求,並且處理突發4個請求的時候,沒有延遲,等到完成之後,按照正常的速率處理。
二、控制併發量
ngx_http_limit_conn_module 提供了限制連線數的能力。主要是利用limit_conn_zone和limit_conn兩個指令。
利用連線數限制 某一個使用者的ip連線的數量來控制流量。
nginx的配置如下:
http { include mime.types; default_type application/octet-stream; #根據IP地址來限制,儲存記憶體大小10M limit_conn_zone $binary_remote_addr zone=addr:10m; server { listen 80; server_name localhost; location /test_content{ limit_conn addr 2; } } }
limit_conn_zone $binary_remote_addr zone=addr:10m; 表示限制根據使用者的IP地址來顯示,設定儲存地址為的記憶體大小10M
limit_conn addr 2; 表示 同一個地址只允許連線2次。