1. 程式人生 > 其它 >nginx的限流功能

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次。