Nginx限流和黑名單配置的策略
1 背景介紹
為了防止一些搶票助手所發(fā)起的一些無(wú)用請(qǐng)求,我們可以使用 nginx 中的限流策略進(jìn)行限流操作。
常見(jiàn)的限流算法:計(jì)數(shù)器、漏桶算法、令牌桶算法
Java高并發(fā)系統(tǒng)限流算法的應(yīng)用
從作用上來(lái)說(shuō),漏桶和令牌桶算法最明顯的區(qū)別就是是否允許突發(fā)流量(burst)的處理,漏桶算法能夠強(qiáng)行限制數(shù)據(jù)的實(shí)時(shí)傳輸(處理)速率,對(duì)突發(fā)流量不做額外處理;而令牌桶算法能夠在限制數(shù)據(jù)的平均傳輸速率的同時(shí)允許某種程度的突發(fā)傳輸。
2 Nginx 的限流策略
Nginx 的限流主要是兩種方式: 限制訪問(wèn)頻率
和限制并發(fā)連接數(shù)
。
Nginx 按請(qǐng)求速率限速模塊使用的是漏桶算法,即能夠強(qiáng)行保證請(qǐng)求的實(shí)時(shí)處理速度不會(huì)超過(guò)設(shè)置的閾值。
Nginx 官方版本限制 IP 的連接和并發(fā)分別有兩個(gè)模塊:
1、limit_req_zone:用來(lái)限制單位時(shí)間內(nèi)的請(qǐng)求數(shù),即速率限制 , 采用的漏桶算法 “leaky bucket”。
2、limit_conn_zone:用來(lái)限制同一時(shí)間連接數(shù),即并發(fā)限制。
2.1 limit_req_zone限制訪問(wèn)頻率
使用語(yǔ)法:limit_req_zone key zone rate
key :定義限流對(duì)象,binary_remote_addr 是一種 key,表示基于 remote_addr(客戶端 IP) 來(lái)做限流,binary_ 的目的是壓縮內(nèi)存占用量。
zone:定義共享內(nèi)存區(qū)來(lái)存儲(chǔ)訪問(wèn)信息, myRateLimit:10m 表示一個(gè)大小為 10M,名字為 myRateLimit 的內(nèi)存區(qū)域。1M 能存儲(chǔ) 16000 IP 地址的
訪問(wèn)信息,10M 可以存儲(chǔ) 16W IP 地址訪問(wèn)信息。
rate: 用于設(shè)置最大訪問(wèn)速率,rate=10r/s 表示每秒最多處理 10 個(gè)請(qǐng)求。Nginx 實(shí)際上以毫秒為粒度來(lái)跟蹤請(qǐng)求信息,因此 10r/s 實(shí)際上是限制:每 100 毫秒處理一個(gè)請(qǐng)求。這意味著,自上一個(gè)請(qǐng)求處理完后,若后續(xù) 100 毫秒內(nèi)又有請(qǐng)求到達(dá),將拒絕處理該請(qǐng)求。
舉例:
http { # 定義限流策略 limit_req_zone $binary_remote_addr zone=rateLimit:10m rate=1r/s ; # 搜索服務(wù)的虛擬主機(jī) server { location / { # 使用限流策略,burst=5,重點(diǎn)說(shuō)明一下這個(gè)配置,burst 爆發(fā)的意思,這個(gè)配置的意思是設(shè)置一個(gè)大小為 5 的緩沖區(qū)(隊(duì)列)當(dāng)有大量請(qǐng)求(爆發(fā))過(guò)來(lái)時(shí), # 超過(guò)了訪問(wèn)頻次限制的請(qǐng)求可以先放到這個(gè)緩沖區(qū)內(nèi)。nodelay,如果設(shè)置,超過(guò)訪問(wèn)頻次而且緩沖區(qū)也滿了的時(shí)候就會(huì)直接返回 503,如果沒(méi)有設(shè)置,則所 # 有請(qǐng)求會(huì)等待排隊(duì)。 limit_req zone=rateLimit burst=5 nodelay; proxy_pass http://train-manager-search ; } } }
頻繁訪問(wèn):
2.2 limit_conn_zone限制最大連接數(shù)
使用語(yǔ)法:limit_conn_zone key zone
key :定義限流對(duì)象,binary_remote_addr 是一種 key,表示基于 remote_addr(客戶端 IP) 來(lái)做限流,binary_ 的目的是壓縮內(nèi)存占用量。
zone:定義共享內(nèi)存區(qū)來(lái)存儲(chǔ)訪問(wèn)信息, myRateLimit:10m 表示一個(gè)大小為 10M,名字為 myRateLimit 的內(nèi)存區(qū)域。1M 能存儲(chǔ) 16000 IP 地址的
訪問(wèn)信息,10M 可以存儲(chǔ) 16W IP 地址訪問(wèn)信息。
舉例:
http { # 定義限流策略 limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; # 搜索服務(wù)的虛擬主機(jī) server { location / { # 對(duì)應(yīng)的 key 是 $binary_remote_addr,表示限制單個(gè) IP 同時(shí)最多能持有 1 個(gè)連接。 limit_conn perip 1; # 對(duì)應(yīng)的 key 是 $server_name,表示虛擬主機(jī)(server) 同時(shí)能處理并發(fā)連接的總數(shù)。注意,只有當(dāng) request header 被 后端 server 處理后,這個(gè)連接才進(jìn)行計(jì)數(shù)。 limit_conn perserver 10 ; proxy_pass http://train-manager-search ; } } }
3 黑名單設(shè)置
有時(shí)候會(huì)有一些惡意IP攻擊服務(wù)器,會(huì)基于程序頻繁發(fā)起請(qǐng)求對(duì)服務(wù)器造成巨大壓力,我們此時(shí)可以使用Nginx的黑名單功能實(shí)現(xiàn)黑名單過(guò)濾操作。我們首先需要配置黑名單IP,黑名單IP我們可以記錄到一個(gè)配置文件中,比如配置到blockip.conf
文件中:
配置固定IP為黑名單:
deny 192.168.100.1;
在nginx.conf
中引入blockip.conf
,可以放到http, server, location語(yǔ)句塊,配置如下:
#黑名單 include blockip.conf;
此時(shí)在192.168.100.1
的IP上訪問(wèn)服務(wù)器,會(huì)報(bào)如下錯(cuò)誤:
屏蔽ip的配置文件既可以屏蔽單個(gè)ip,也可以屏蔽ip段,或者只允許某個(gè)ip或者某個(gè)ip段訪問(wèn)。
# 屏蔽單個(gè)ip訪問(wèn) deny IP; # 允許單個(gè)ip訪問(wèn) allow IP; # 屏蔽所有ip訪問(wèn) deny all; # 允許所有ip訪問(wèn) allow all; #屏蔽整個(gè)段即從123.0.0.1到123.255.255.254訪問(wèn)的命令 deny 123.0.0.0/8 #屏蔽IP段即從123.45.0.1到123.45.255.254訪問(wèn)的命令 deny 124.45.0.0/16 #屏蔽IP段即從123.45.6.1到123.45.6.254訪問(wèn)的命令 deny 123.45.6.0/24 1234567891011121314
如果你想實(shí)現(xiàn)這樣的應(yīng)用,除了幾個(gè)IP外,其他全部拒絕,那需要你在blockip.conf中這樣寫(xiě):
allow 192.168.100.1; allow 192.168.100.2; deny all; 123
但是這種手動(dòng)配置的方式可能太過(guò)繁瑣,我們也可以配置動(dòng)態(tài)黑白名單。
配置動(dòng)態(tài)黑白名單,我們可以采用Lua+Redis實(shí)現(xiàn),將黑名單存入到Redis緩存,每次執(zhí)行請(qǐng)求時(shí),通過(guò)lua腳本先獲取用戶IP,匹配IP是否屬于黑名單,如果是,則不讓請(qǐng)求,如果不是,則放行。
到此這篇關(guān)于Nginx限流和黑名單配置的文章就介紹到這了,更多相關(guān)nginx限流配置內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。