濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Nginx使用limit_req_zone對(duì)同一IP訪問(wèn)進(jìn)行限流的方法

Nginx使用limit_req_zone對(duì)同一IP訪問(wèn)進(jìn)行限流的方法

熱門(mén)標(biāo)簽:承德地圖標(biāo)注公司 山東企業(yè)外呼系統(tǒng)公司 百度地圖標(biāo)注公司位置要多少錢(qián) 地圖標(biāo)注黃河的位置 靈圖uu電子寵物店地圖標(biāo)注 地圖標(biāo)注如何改成微信號(hào) 虛假地圖標(biāo)注 400電話號(hào)碼辦理多少錢(qián) 濮陽(yáng)好的聯(lián)通400電話申請(qǐng)

nginx可以使用ngx_http_limit_req_module模塊的limit_req_zone指令進(jìn)行限流訪問(wè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;

說(shuō)明:區(qū)域名稱為one(自定義),占用空間大小為10m,平均處理的請(qǐng)求頻率不能超過(guò)每秒一次。

$binary_remote_addr是$remote_addr(客戶端IP)的二進(jìn)制格式,固定占用4個(gè)字節(jié)(可能是C語(yǔ)言的long類(lèi)型長(zhǎng)度)。而$remote_addr按照字符串存儲(chǔ),占用7-15個(gè)字節(jié)。這樣看來(lái)用$binary_remote_addr可以節(jié)省空間,但網(wǎng)上又說(shuō)64位系統(tǒng)下都是占用64個(gè)字節(jié),沒(méi)搞清楚,總之盡量用$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)上都說(shuō)峰值之類(lèi)的,通過(guò)親自試驗(yàn)發(fā)現(xiàn)這么說(shuō)并不準(zhǔn)確,應(yīng)該叫緩沖隊(duì)列的長(zhǎng)度比較合適。

nodelay字面的意思是不延遲,具體說(shuō)是對(duì)用戶發(fā)起的請(qǐng)求不做延遲處理,而是立即處理。比如我上面定義的rate=1r/s,即每秒鐘只處理1個(gè)請(qǐng)求。如果同一時(shí)刻有兩個(gè)后綴為htm的請(qǐng)求過(guò)來(lái)了,若設(shè)置了nodelay,則會(huì)立刻處理這兩個(gè)請(qǐng)求。若沒(méi)設(shè)置nodelay,則會(huì)嚴(yán)格執(zhí)行rate=1r/s的配置,即只處理一個(gè)請(qǐng)求,然后下一秒鐘再處理另外一個(gè)請(qǐng)求。直觀的看就是頁(yè)面數(shù)據(jù)卡了,過(guò)了一秒后才加載出來(lái)。

真正對(duì)限流起作用的配置就是rate=1r/s和burst=5這兩個(gè)配置。下面我們來(lái)分析一下具體案例。

某一時(shí)刻有兩個(gè)請(qǐng)求同時(shí)到達(dá)nginx,其中一個(gè)被處理,另一個(gè)放到了緩沖隊(duì)列里。雖然配置了nodelay導(dǎo)致第二個(gè)請(qǐng)求也被瞬間處理了,但還是占用了緩沖隊(duì)列的一個(gè)長(zhǎng)度,如果下一秒沒(méi)有請(qǐng)求過(guò)來(lái),這個(gè)占用burst一個(gè)長(zhǎng)度的空間就會(huì)被釋放,否則就只能繼續(xù)占用著burst的空間,直到burst空間占用超過(guò)5之后,再來(lái)請(qǐng)求就會(huì)直接被nginx拒絕,返回503錯(cuò)誤碼。

可見(jiàn),如果第二秒又來(lái)了兩個(gè)請(qǐng)求,其中一個(gè)請(qǐng)求又占用了一個(gè)burst空間,第三秒、第四秒直到第五秒,每秒都有兩個(gè)請(qǐng)求過(guò)來(lái),雖然兩個(gè)請(qǐng)求都被處理了(因?yàn)榕渲昧薾odelay),但其中一個(gè)請(qǐng)求仍然占用了一個(gè)burst長(zhǎng)度,五秒后整個(gè)burst長(zhǎng)度=5都被占用了。第六秒再過(guò)來(lái)兩個(gè)請(qǐng)求,其中一個(gè)請(qǐng)求就被拒絕了。

這是我根據(jù)實(shí)際測(cè)試結(jié)果推論的,可能和真實(shí)的理論有所出入,但這樣講我覺(jué)得比較好理解。有清楚的朋友歡迎告知!

這里用到的$binary_remote_addr是在客戶端和nginx之間沒(méi)有代理層的情況。如果你在nginx之前配置了CDN,那么$binary_remote_addr的值就是CDN的IP地址。這樣限流的話就不對(duì)了。需要獲取到用戶的真實(shí)IP進(jìn)行限流。

簡(jiǎn)單說(shuō)明如下:

## 這里取得原始用戶的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ò)爬蟲(chóng)進(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訪問(wèn)進(jìn)行限流的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

標(biāo)簽:泰安 安康 淮安 福州 樂(lè)山 德宏 上海 鷹潭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Nginx使用limit_req_zone對(duì)同一IP訪問(wèn)進(jìn)行限流的方法》,本文關(guān)鍵詞  Nginx,使用,limit,req,zone,對(duì),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Nginx使用limit_req_zone對(duì)同一IP訪問(wèn)進(jìn)行限流的方法》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Nginx使用limit_req_zone對(duì)同一IP訪問(wèn)進(jìn)行限流的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    阿合奇县| 绥芬河市| 威海市| 墨竹工卡县| 南昌市| 武宣县| 万全县| 灵宝市| 库尔勒市| 九龙县| 酉阳| 汉川市| 甘孜县| 桑植县| 蒙城县| 吐鲁番市| 通化县| 永福县| 台湾省| 安庆市| 抚顺市| 涡阳县| 镇江市| 汤阴县| 祥云县| 柯坪县| 汪清县| 门头沟区| 恩平市| 寿阳县| 渝中区| 米脂县| 海南省| 维西| 宁安市| 南部县| 攀枝花市| 舟山市| 自治县| 榆社县| 德化县|