首頁 > 軟體

Nginx限流和黑名單設定的策略

2022-05-18 10:01:19

1 背景介紹

為了防止一些搶票助手所發起的一些無用請求,我們可以使用 nginx 中的限流策略進行限流操作。
常見的限流演演算法:計數器、漏桶演演算法、令牌桶演演算法

Java高並行系統限流演演算法的應用

從作用上來說,漏桶和令牌桶演演算法最明顯的區別就是是否允許突發流量(burst)的處理,漏桶演演算法能夠強行限制資料的實時傳輸(處理)速率,對突發流量不做額外處理;而令牌桶演演算法能夠在限制資料的平均傳輸速率的同時允許某種程度的突發傳輸。

2 Nginx 的限流策略

Nginx 的限流主要是兩種方式: 限制存取頻率限制並行連線數
Nginx 按請求速率限速模組使用的是漏桶演演算法,即能夠強行保證請求的實時處理速度不會超過設定的閾值。

Nginx 官方版本限制 IP 的連線和並行分別有兩個模組:
1、limit_req_zone:用來限制單位時間內的請求數,即速率限制 , 採用的漏桶演演算法 “leaky bucket”。
2、limit_conn_zone:用來限制同一時間連線數,即並行限制。

2.1 limit_req_zone限制存取頻率

使用語法:limit_req_zone key zone rate
key :定義限流物件,binary_remote_addr 是一種 key,表示基於 remote_addr(使用者端 IP) 來做限流,binary_ 的目的是壓縮記憶體佔用量。
zone:定義共用記憶體區來儲存存取資訊, myRateLimit:10m 表示一個大小為 10M,名字為 myRateLimit 的記憶體區域。1M 能儲存 16000 IP 地址的
存取資訊,10M 可以儲存 16W IP 地址存取資訊。
rate: 用於設定最大存取速率,rate=10r/s 表示每秒最多處理 10 個請求。Nginx 實際上以毫秒為粒度來跟蹤請求資訊,因此 10r/s 實際上是限制:每 100 毫秒處理一個請求。這意味著,自上一個請求處理完後,若後續 100 毫秒內又有請求到達,將拒絕處理該請求。

舉例:

http {
# 定義限流策略
limit_req_zone $binary_remote_addr zone=rateLimit:10m rate=1r/s ;
# 搜尋服務的虛擬主機
server {
location / {
# 使用限流策略,burst=5,重點說明一下這個設定,burst 爆發的意思,這個設定的意思是設定一個大小為 5 的緩衝區(佇列)當有大量請求(爆發)過來時,

# 超過了存取頻次限制的請求可以先放到這個緩衝區內。nodelay,如果設定,超過存取頻次而且緩衝區也滿了的時候就會直接返回 503,如果沒有設定,則所

# 有請求會等待排隊。
limit_req zone=rateLimit burst=5 nodelay;
proxy_pass http://train-manager-search ;
   }
  }
}

頻繁存取:

2.2 limit_conn_zone限制最大連線數

使用語法:limit_conn_zone key zone
key :定義限流物件,binary_remote_addr 是一種 key,表示基於 remote_addr(使用者端 IP) 來做限流,binary_ 的目的是壓縮記憶體佔用量。
zone:定義共用記憶體區來儲存存取資訊, myRateLimit:10m 表示一個大小為 10M,名字為 myRateLimit 的記憶體區域。1M 能儲存 16000 IP 地址的
存取資訊,10M 可以儲存 16W IP 地址存取資訊。
舉例:

http {
# 定義限流策略
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
# 搜尋服務的虛擬主機
server {
location / {
# 對應的 key 是 $binary_remote_addr,表示限制單個 IP 同時最多能持有 1 個連線。
limit_conn perip 1;
# 對應的 key 是 $server_name,表示虛擬主機(server) 同時能處理並行連線的總數。注意,只有當 request header 被
後端 server 處理後,這個連線才進行計數。
limit_conn perserver 10 ;
proxy_pass http://train-manager-search ;
    }
  }
}

3 黑名單設定

有時候會有一些惡意IP攻擊伺服器,會基於程式頻繁發起請求對伺服器造成巨大壓力,我們此時可以使用Nginx的黑名單功能實現黑名單過濾操作。我們首先需要設定黑名單IP,黑名單IP我們可以記錄到一個組態檔中,比如設定到blockip.conf檔案中:

設定固定IP為黑名單:

deny 192.168.100.1;

nginx.conf中引入blockip.conf,可以放到http, server, location語句塊,設定如下:

#黑名單
include blockip.conf;

此時在192.168.100.1的IP上存取伺服器,會報如下錯誤:

遮蔽ip的組態檔既可以遮蔽單個ip,也可以遮蔽ip段,或者只允許某個ip或者某個ip段存取。

# 遮蔽單個ip存取
deny IP;
# 允許單個ip存取
allow IP;
# 遮蔽所有ip存取
deny all;
# 允許所有ip存取
allow all;
#遮蔽整個段即從123.0.0.1到123.255.255.254存取的命令
deny 123.0.0.0/8
#遮蔽IP段即從123.45.0.1到123.45.255.254存取的命令
deny 124.45.0.0/16
#遮蔽IP段即從123.45.6.1到123.45.6.254存取的命令
deny 123.45.6.0/24
1234567891011121314

如果你想實現這樣的應用,除了幾個IP外,其他全部拒絕,那需要你在blockip.conf中這樣寫:

allow 192.168.100.1;
allow 192.168.100.2;
deny all;
123

但是這種手動設定的方式可能太過繁瑣,我們也可以設定動態黑白名單。

設定動態黑白名單,我們可以採用Lua+Redis實現,將黑名單存入到Redis快取,每次執行請求時,通過lua指令碼先獲取使用者IP,匹配IP是否屬於黑名單,如果是,則不讓請求,如果不是,則放行。

到此這篇關於Nginx限流和黑名單設定的文章就介紹到這了,更多相關nginx限流設定內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com