Nginx使用limit_req_zone對(duì)同一IP訪問進(jìn)行限流的方法
nginx可以使用ngx_http_limit_req_module模塊的limit_req_zone指令進(jìn)行限流訪問,防止用戶惡意攻擊刷爆服務(wù)器。ngx_http_limit_req_module模塊是nginx默認(rèn)安裝的,所以直接配置即可。
首先,在nginx.conf文件中的http模塊下配置
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
說明:區(qū)域名稱為one(自定義),占用空間大小為10m,平均處理的請(qǐng)求頻率不能超過每秒一次。
$binary_remote_addr是$remote_addr(客戶端IP)的二進(jìn)制格式,固定占用4個(gè)字節(jié)(可能是C語言的long類型長(zhǎng)度)。而$remote_addr按照字符串存儲(chǔ),占用7-15個(gè)字節(jié)。這樣看來用$binary_remote_addr可以節(jié)省空間,但網(wǎng)上又說64位系統(tǒng)下都是占用64個(gè)字節(jié),沒搞清楚,總之盡量用$binary_remote_addr吧。
第二,在http模塊的子模塊server下面配置
location ~* .htm$ {
limit_req zone=one burst=5 nodelay;
proxy_pass http://backend_tomcat;
}
我這里是對(duì)uri后綴為htm的請(qǐng)求限流,注意limit_req zone=one burst=5 nodelay;
其中zone=one和前面的定義對(duì)應(yīng)。
burst這個(gè)網(wǎng)上都說峰值之類的,通過親自試驗(yàn)發(fā)現(xiàn)這么說并不準(zhǔn)確,應(yīng)該叫緩沖隊(duì)列的長(zhǎng)度比較合適。
nodelay字面的意思是不延遲,具體說是對(duì)用戶發(fā)起的請(qǐng)求不做延遲處理,而是立即處理。比如我上面定義的rate=1r/s,即每秒鐘只處理1個(gè)請(qǐng)求。如果同一時(shí)刻有兩個(gè)后綴為htm的請(qǐng)求過來了,若設(shè)置了nodelay,則會(huì)立刻處理這兩個(gè)請(qǐng)求。若沒設(shè)置nodelay,則會(huì)嚴(yán)格執(zhí)行rate=1r/s的配置,即只處理一個(gè)請(qǐng)求,然后下一秒鐘再處理另外一個(gè)請(qǐng)求。直觀的看就是頁面數(shù)據(jù)卡了,過了一秒后才加載出來。
真正對(duì)限流起作用的配置就是rate=1r/s和burst=5這兩個(gè)配置。下面我們來分析一下具體案例。
某一時(shí)刻有兩個(gè)請(qǐng)求同時(shí)到達(dá)nginx,其中一個(gè)被處理,另一個(gè)放到了緩沖隊(duì)列里。雖然配置了nodelay導(dǎo)致第二個(gè)請(qǐng)求也被瞬間處理了,但還是占用了緩沖隊(duì)列的一個(gè)長(zhǎng)度,如果下一秒沒有請(qǐng)求過來,這個(gè)占用burst一個(gè)長(zhǎng)度的空間就會(huì)被釋放,否則就只能繼續(xù)占用著burst的空間,直到burst空間占用超過5之后,再來請(qǐng)求就會(huì)直接被nginx拒絕,返回503錯(cuò)誤碼。
可見,如果第二秒又來了兩個(gè)請(qǐng)求,其中一個(gè)請(qǐng)求又占用了一個(gè)burst空間,第三秒、第四秒直到第五秒,每秒都有兩個(gè)請(qǐng)求過來,雖然兩個(gè)請(qǐng)求都被處理了(因?yàn)榕渲昧薾odelay),但其中一個(gè)請(qǐng)求仍然占用了一個(gè)burst長(zhǎng)度,五秒后整個(gè)burst長(zhǎng)度=5都被占用了。第六秒再過來兩個(gè)請(qǐng)求,其中一個(gè)請(qǐng)求就被拒絕了。
這是我根據(jù)實(shí)際測(cè)試結(jié)果推論的,可能和真實(shí)的理論有所出入,但這樣講我覺得比較好理解。有清楚的朋友歡迎告知!
這里用到的$binary_remote_addr是在客戶端和nginx之間沒有代理層的情況。如果你在nginx之前配置了CDN,那么$binary_remote_addr的值就是CDN的IP地址。這樣限流的話就不對(duì)了。需要獲取到用戶的真實(shí)IP進(jìn)行限流。
簡(jiǎn)單說明如下:
## 這里取得原始用戶的IP地址
map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$$firstAddr;
}
## 針對(duì)原始用戶 IP 地址做限制
limit_req_zone $clientRealIp zone=one:10m rate=1r/s;
同理,我們可以用limit模塊對(duì)網(wǎng)絡(luò)爬蟲進(jìn)行限流。
http模塊
limit_req_zone $anti_spider zone=anti_spider:10m rate=1r/s;
server模塊
location / {
limit_req zone=anti_spider burst=2 nodelay;
if ($http_user_agent ~* "spider|Googlebot") {
set $anti_spider $http_user_agent;
}
}
可以用curl -I -A "Baiduspider" www.remotejob.cn/notice.jsp 測(cè)試一下
以上這篇Nginx使用limit_req_zone對(duì)同一IP訪問進(jìn)行限流的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Nginx配合Apache或Tomcat的動(dòng)靜分離基本配置實(shí)例
這篇文章主要介紹了Nginx配合Apache或Tomcat的動(dòng)靜分離基本配置實(shí)例,實(shí)際上Nginx專門負(fù)責(zé)靜態(tài)和反向代理是主流服務(wù)器配置方案,需要的朋友可以參考下2016-01-01
生產(chǎn)環(huán)境部署Nginx服務(wù)器雙機(jī)熱備部署keepalived的步驟(多種模式教程)
今天演示下生產(chǎn)環(huán)境keepalived的部署方式,安裝模式有很多,比如說主備模型和雙主模型,主備分:搶占模式 和 非搶占模式,對(duì)Nginx keepalived 雙機(jī)熱備部署相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2024-07-07
Nginx反向代理實(shí)現(xiàn)支持長(zhǎng)連接詳解
這篇文章主要給大家介紹了關(guān)于Nginx反向代理實(shí)現(xiàn)支持長(zhǎng)連接的相關(guān)資料,文字介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
Nginx中日志模塊的應(yīng)用和配置應(yīng)用示例
Nginx是一款高性能的HTTP和反向代理服務(wù)器,廣泛應(yīng)用于互聯(lián)網(wǎng)領(lǐng)域,這篇文章主要介紹了Nginx中日志模塊的應(yīng)用和配置,下面通過一個(gè)簡(jiǎn)單的實(shí)例來演示Nginx日志模塊的應(yīng)用和配置,需要的朋友可以參考下2024-02-02
nginx基于IP的多虛擬主機(jī)實(shí)現(xiàn)
如果同一臺(tái)服務(wù)器有多個(gè)IP,可以使用基于IP的虛機(jī)主機(jī)配置,將不同的服務(wù)綁定在不同的IP上,本文主要介紹了nginx基于IP的多虛擬主機(jī)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
詳解Nginx幾種常見實(shí)現(xiàn)301重定向方法上的區(qū)別
本篇文章主要介紹了詳解Nginx幾種常見實(shí)現(xiàn)301重定向方法上的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
添加Nginx代理配置只允許內(nèi)部IP訪問的實(shí)現(xiàn)方法
在本篇文章里小編給大家整理的是一篇關(guān)于添加Nginx代理配置只允許內(nèi)部IP訪問的實(shí)現(xiàn)方法的文章,有需要的朋友們可以學(xué)習(xí)下。2019-10-10
Nginx+ModSecurity安全模塊部署的實(shí)現(xiàn)
本文主要介紹了Nginx+ModSecurity安全模塊部署的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08

