您好,登錄后才能下訂單哦!
小編給大家分享一下Nginx中如何使用limit模塊限制并發(fā)數(shù),希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
nginx 限制ip并發(fā)數(shù),nginx限制IP連接數(shù)的范例參考:
如何Nginx限制同一個ip的連接數(shù),限制并發(fā)數(shù)目:
1.添加limit_zone和limit_req_zone 這個變量只能在http使用 :
vi /export/servers/nginx/conf/nginx.conf limit_zone one $binary_remote_addr 20m; limit_req_zone $binary_remote_addr zone=req_one:20m rate=12r/s;
2.添加limit_conn 和limit_req 這個變量可以在http, server, location使用 我是限制nginx上的所有服務(wù),所以添加到http里面 (如果你需要限制部分服務(wù),可在nginx/conf/domains里面選擇相應(yīng)的server或者location添加上便可)
vi /export/servers/nginx/conf/nginx.conf limit_zone one $binary_remote_addr 20m; limit_req_zone $binary_remote_addr zone=req_one:20m rate=12r/s; limit_conn one 10; limit_req zone=req_one burst=120;
參數(shù)詳解(數(shù)值按具體需要和服務(wù)器承載能力設(shè)置,):
limit_zone,是針對每個變量(這里指IP,即$binary_remote_addr)定義一個存儲session狀態(tài)的容器。這個示例中定義了一個20m的容器,按照32bytes/session,可以處理640000個session。 limit_req_zone 與limit_zone類似。rate是請求頻率. 每秒允許12個請求。 limit_conn one 10 : 表示一個IP能發(fā)起10個并發(fā)連接數(shù) limit_req: 與limit_req_zone對應(yīng)。burst表示緩存住的請求數(shù)。
范例:
http { limit_zone one $binary_remote_addr 20m; limit_req_zone $binary_remote_addr zone=req_one:20m rate=12r/s; limit_conn one 10; limit_req zone=req_one burst=120; server { listen 80; server_name status.xxx.com ; location / { stub_status on; access_log off; } } }
3.重啟nginx
/export/servers/nginx/sbin/nginx -s reload
Nginx限制流量/限制帶寬 具體參考官方文檔
關(guān)于limit_zone
關(guān)于limit_req
以上配置會對所有的ip都進(jìn)行限制,有些時候我們不希望對搜索引擎的蜘蛛或者某些自己的代理機(jī)過來的請求進(jìn)行限制, 對于特定的白名單ip我們可以借助geo指令實現(xiàn)。
先在nginx的請求日志進(jìn)行統(tǒng)計,查看那個ip的訪問量比較大, 運行:
cat access.log | grep "03/Jun" |awk '{print $1}'|sort |uniq -c|sort -nrk 1|head -n 10 #列出訪問日志里面在6月3號這天前10個訪問量最大的ip.
接下來就可以對這些IP進(jìn)行分析了。看哪些需要進(jìn)行白名單設(shè)置。
http{ geo $limited { # the variable created is $limited default 1; 127.0.0.1/32 0; 10.12.212.63 0; } map $limited $limit { 1 $binary_remote_addr; 0 ""; } limit_zone one $binary_remote_addr 20m; limit_req_zone $limit zone=req_one:20m rate=20r/s; limit_conn one 10; limit_req zone=req_one burst=120; }
上面兩個需要用到map和geo模塊,這是nginx自帶的模塊,有的運維喜歡把他們關(guān)閉,自己./sbin/nginx -V 留意一下。把配置的--whithout-XXX-module 去掉重新編譯一下就可以了。 上面這段配置的意思是:
1.geo指令定義了一個白名單$limited變量,默認(rèn)值為1,如果客戶端ip在上面的范圍內(nèi),$limited的值為0
2.使用map指令映射搜索引擎客戶端的ip為空串,如果不是搜索引擎就顯示本身真實的ip,這樣搜索引擎ip就不能存到limit_req_zone內(nèi)存session中,所以不會限制搜索引擎的ip訪問
PS:
順帶一提,為了獲取客戶端的真實IP。該模塊需要安裝read_ip模塊,運維應(yīng)該默認(rèn)有安裝。沒有的話也可自行安裝: 配置方式相當(dāng)簡單,重新編譯 Nginx 加上 --with-http_realip_module 參數(shù),如:
./configure --prefix=/opt/nginx --with-http_stub_status_module --with-pcre=../pcre-6.6 --with-http_realip_module make make install
在server中增加:
set_real_ip_from 192.168.1.0/24; set_real_ip_from 192.168.2.1; real_ip_header [X-Real-IP|X-Forwarded-For];
需要說明的地方就是設(shè)置IP源的時候可以設(shè)置單個IP,也可以設(shè)置IP段,另外是使用X-Real-IP還是X-Forwarded-For,取決于前面的服務(wù)器有哪個頭。
set_real_ip_from 設(shè)置的IP端可以讓運維查看日志,看下你的請求是來自哪些ip段。
重新加載一下服務(wù),差不多就OK了。
再查看日志的話,應(yīng)該可以看到客戶端的真實IP了。
注意:如果未安裝該模塊的話你的獲取到的IP端可能是來自前端代理(如squid)的IP,結(jié)果就是多個用戶被當(dāng)成單個用戶對待,導(dǎo)致應(yīng)用不能響應(yīng)。 參考:http://hi.baidu.com/thinkinginlamp/item/e2cf05263eb4d18e6e2cc3e6
再PS一下: 自測: 有條件的自己可以用ab或者webben自測一下。
未安裝前壓測的話,因為有大量請求,所以access.log會有大量日志,而error.log日志沒有變化。
[root@qrwefsdf talk]# webbench -c 30 -t 30 http://xxx.com Webbench - Simple Web Benchmark 1.5 Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software. Benchmarking: GET http://xxx.com 30 clients, running 30 sec. Speed=193468 pages/min, 1254317 bytes/sec. Requests: 96734 susceed, 0 failed.
安裝后會發(fā)現(xiàn)很多超出的請求會返回503,所以access.log日志變化不快,error.log有大量記錄,提示limit_reque緩住了多少請求。
[root@qrwefsdf talk]# webbench -c 30 -t 30 http://xxxx.com Webbench - Simple Web Benchmark 1.5 Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software. Benchmarking: GET http://xxx.com 30 clients, running 30 sec. Speed=120 pages/min, 778 bytes/sec. Requests: 60 susceed, 0 failed.
需要注意的是Nginx版本目前是 nginx version: openresty/1.9.3.2
已經(jīng)不支持limit_zone配置,
改為如下模式
http{
limit_conn_zone $binary_remote_addr zone=one:20m;
limit_req_zone $binary_remote_addr zone=req_one:20m rate=1r/s;
limit_conn one 1;
limit_req zone=req_one burst=1;
看完了這篇文章,相信你對“Nginx中如何使用limit模塊限制并發(fā)數(shù)”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。