欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Nginx如何使用limit_req_zone對同一IP訪問進(jìn)行限流

這篇文章主要介紹Nginx如何使用limit_req_zone對同一IP訪問進(jìn)行限流,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)專注于遷西企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城開發(fā)。遷西網(wǎng)站建設(shè)公司,為遷西等地區(qū)提供建站服務(wù)。全流程按需規(guī)劃網(wǎng)站,專業(yè)設(shè)計,全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

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,平均處理的請求頻率不能超過每秒一次。

$binary_remote_addr是$remote_addr(客戶端IP)的二進(jìn)制格式,固定占用4個字節(jié)(可能是C語言的long類型長度)。而$remote_addr按照字符串存儲,占用7-15個字節(jié)。這樣看來用$binary_remote_addr可以節(jié)省空間,但網(wǎng)上又說64位系統(tǒng)下都是占用64個字節(jié),沒搞清楚,總之盡量用$binary_remote_addr吧。

第二,在http模塊的子模塊server下面配置

location ~* .htm$ {
limit_req zone=one burst=5 nodelay;
proxy_pass http://backend_tomcat;
}

我這里是對uri后綴為htm的請求限流,注意limit_req zone=one burst=5 nodelay;

其中zone=one和前面的定義對應(yīng)。

burst這個網(wǎng)上都說峰值之類的,通過親自試驗(yàn)發(fā)現(xiàn)這么說并不準(zhǔn)確,應(yīng)該叫緩沖隊列的長度比較合適。

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

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

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

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

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

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

簡單說明如下:

## 這里取得原始用戶的IP地址
map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$$firstAddr;
}

## 針對原始用戶 IP 地址做限制
limit_req_zone $clientRealIp zone=one:10m rate=1r/s;

同理,我們可以用limit模塊對網(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 測試一下

以上是“Nginx如何使用limit_req_zone對同一IP訪問進(jìn)行限流”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁標(biāo)題:Nginx如何使用limit_req_zone對同一IP訪問進(jìn)行限流
文章源于:http://www.chinadenli.net/article42/pidoec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)關(guān)鍵詞優(yōu)化移動網(wǎng)站建設(shè)網(wǎng)站設(shè)計公司品牌網(wǎng)站建設(shè)商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司