Nginx limit模組限制併發數
nginx 限制ip併發數,nginx限制IP連線數的範例參考:
如何Nginx限制同一個ip的連線數,限制併發數目:
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上的所有服務,所以新增到http裡面 (如果你需要限制部分服務,可在nginx/conf/domains裡面選擇相應的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;
引數詳解(數值按具體需要和伺服器承載能力設定,):
limit_zone,是針對每個變數(這裡指IP,即$binary_remote_addr)定義一個儲存session狀態的容器。這個示例中定義了一個20m的容器,按照32bytes/session,可以處理640000個session。
limit_req_zone 與limit_zone類似。rate是請求頻率. 每秒允許12個請求。
limit_conn one 10 : 表示一個IP能發起10個併發連線數
limit_req: 與limit_req_zone對應。burst表示快取住的請求數。
範例:
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限制流量/限制頻寬 具體參考官方文件
nginx白名單設定
以上配置會對所有的ip都進行限制,有些時候我們不希望對搜尋引擎的蜘蛛或者某些自己的代理機過來的請求進行限制, 對於特定的白名單ip我們可以藉助geo指令實現。
先在nginx的請求日誌進行統計,檢視那個ip的訪問量比較大, 執行:
cat access.log | grep "03/Jun" |awk '{print $1}'|sort |uniq -c|sort -nrk 1|head -n 10 #列出訪問日誌裡面在6月3號這天前10個訪問量最大的ip.
接下來就可以對這些IP進行分析了。看哪些需要進行白名單設定。
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自帶的模組,有的運維喜歡把他們關閉,自己./sbin/nginx -V 留意一下。把配置的--whithout-XXX-module 去掉重新編譯一下就可以了。 上面這段配置的意思是:
1.geo指令定義了一個白名單$limited變數,預設值為1,如果客戶端ip在上面的範圍內,$limited的值為0
2.使用map指令對映搜尋引擎客戶端的ip為空串,如果不是搜尋引擎就顯示本身真實的ip,這樣搜尋引擎ip就不能存到limit_req_zone記憶體session中,所以不會限制搜尋引擎的ip訪問
PS:
獲取客戶端的真實IP
順帶一提,為了獲取客戶端的真實IP。該模組需要安裝read_ip模組,運維應該預設有安裝。沒有的話也可自行安裝: 配置方式相當簡單,重新編譯 Nginx 加上 --with-http_realip_module 引數,如:
./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];
需要說明的地方就是設定IP源的時候可以設定單個IP,也可以設定IP段,另外是使用X-Real-IP還是X-Forwarded-For,取決於前面的伺服器有哪個頭。
set_real_ip_from 設定的IP端可以讓運維檢視日誌,看下你的請求是來自哪些ip段。
重新載入一下服務,差不多就OK了。
再檢視日誌的話,應該可以看到客戶端的真實IP了。
注意:如果未安裝該模組的話你的獲取到的IP端可能是來自前端代理(如squid)的IP,結果就是多個使用者被當成單個使用者對待,導致應用不能響應。 參考:
再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.
安裝後會發現很多超出的請求會返回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
已經不支援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;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2137182/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- nginx如何限制併發連線請求數?Nginx
- 簡單介紹使用p-limit 限制併發數原始碼解析MIT原始碼
- 限制併發數
- linux limit限制LinuxMIT
- 基於 LNMP 的 Nginx 百萬併發之路 (一)核心要素、模組、配置概述LNMPNginx
- 控制請求併發數量:p-limit 原始碼解讀MIT原始碼
- 為 Nginx 新增模組Nginx
- Nginx常用的模組Nginx
- Nginx 新增 lua 模組Nginx
- Nginx安裝nginx-rtmp-module模組Nginx
- Nginx range filter模組數字錯誤漏洞修復 (Nginx平滑升級)NginxFilter
- nginx學習之模組Nginx
- 細述:nginx http核心模組提供的變數和解釋NginxHTTP變數
- 粘包問題、socketserver模組實現併發Server
- Nginx使用SSL模組配置httpsNginxHTTP
- 短影片平臺原始碼,利用mq限制入庫併發數原始碼MQ
- Nginx原始碼研究之nginx限流模組詳解Nginx原始碼
- Nginx為已安裝nginx動態新增模組Nginx
- springboot + shiro 嘗試登入次數限制與併發登入人數控制Spring Boot
- 序列化模組,隨機數模組,os模組,sys模組,hashlib模組隨機
- Nginx速度限制Nginx
- Tengine新增nginx upstream模組的使用Nginx
- nginx事件模組 -- 第二篇Nginx事件
- nginx使用熱部署新增新模組Nginx熱部署
- nginx事件模組-- 第四篇Nginx事件
- nginx事件模組 -- 第三篇Nginx事件
- Nginx使用Lua模組實現WAFNginx
- Nginx Ingress 高併發實踐Nginx
- python–模組之random隨機數模組Pythonrandom隨機
- Nginx的HTTP模組與Stream模組:區別與應用場景NginxHTTP
- Nginx 架構——【核心流程+模組介紹】Nginx架構
- nginx事件模組 -- 第一篇Nginx事件
- Nginx的ngx_http_fastcgi_module模組NginxHTTPAST
- Nginx 學習筆記--程式與模組Nginx筆記
- CentOS 下重新編譯 nginx 新增模組CentOS編譯Nginx
- Nginx 學習總結(4)—— Rewrite 模組Nginx
- Centos下安裝FastDFS及Nginx模組CentOSASTNginx
- day64:nginx模組之限制連線&狀態監控&Location/用nginx+php跑專案/擴充套件應用節點NginxPHP套件
- 深入理解Nginx:模組開發與架構解析(第2版)Nginx架構