nginx能夠經過ngx_http_limit_conn_module
和ngx_http_limit_req_module
配置來限制ip在同一時間段的訪問次數.html
ngx_http_limit_conn_module:該模塊用於限制每一個定義的密鑰的鏈接數,特別是單個IP地址的鏈接數.使用limit_conn_zone和limit_conn指令.node
ngx_http_limit_req_module:用於限制每個定義的密鑰的請求的處理速率,特別是從一個單一的IP地址的請求的處理速率。使用「泄漏桶」方法進行限制.指令:limit_req_zone和limit_req.nginx
ngx_http_limit_conn_module:限制單個IP的鏈接數示例:服務器
http { limit_conn_zone $binary_remote_addr zone=addr:10m; #定義一個名爲addr的limit_req_zone用來存儲session,大小是10M內存, #以$binary_remote_addr 爲key, #nginx 1.18之後用limit_conn_zone替換了limit_conn, #且只能放在http{}代碼段. ... server { ... location /download/ { limit_conn addr 1; #鏈接數限制 #設置給定鍵值的共享內存區域和容許的最大鏈接數。超出此限制時,服務器將返回503(服務臨時不可用)錯誤. #若是區域存儲空間不足,服務器將返回503(服務臨時不可用)錯誤 }
可能有幾個limit_conn指令,如下配置將限制每一個客戶端IP與服務器的鏈接數,同時限制與虛擬服務器的總鏈接數:session
http { limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m ... server { ... limit_conn perip 10; #單個客戶端ip與服務器的鏈接數. limit_conn perserver 100; #限制與服務器的總鏈接數 }
參考文檔:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html測試
ngx_http_limit_req_module:限制某一時間內,單一IP的請求數.網站
示例:spa
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... #定義一個名爲one的limit_req_zone用來存儲session,大小是10M內存, #以$binary_remote_addr 爲key,限制平均每秒的請求爲1個, #1M能存儲16000個狀態,rete的值必須爲整數, server { ... location /search/ { limit_req zone=one burst=5; #限制每ip每秒不超過1個請求,漏桶數burst爲5,也就是隊列. #nodelay,若是不設置該選項,嚴格使用平均速率限制請求數,超過的請求被延時處理. #舉個栗子: #設置rate=20r/s每秒請求數爲20個,漏桶數burst爲5個, #brust的意思就是,若是第1秒、2,3,4秒請求爲19個,第5秒的請求爲25個是被容許的,能夠理解爲20+5 #可是若是你第1秒就25個請求,第2秒超過20的請求返回503錯誤. #若是區域存儲空間不足,服務器將返回503(服務臨時不可用)錯誤 #速率在每秒請求中指定(r/s)。若是須要每秒少於一個請求的速率,則以每分鐘的請求(r/m)指定。 }
還能夠限制來自單個IP地址的請求的處理速率,同時限制虛擬服務器的請求處理速率:日誌
http { limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s; limit_req_zone $server_name zone=perserver:10m rate=10r/s; ... server { ... limit_req zone=perip burst=5 nodelay; #漏桶數爲5個.也就是隊列數.nodelay:不啓用延遲. limit_req zone=perserver burst=10; #限制nginx的處理速率爲每秒10個 }
awk '{print $1}' nginx_access.log |sort |uniq -c|sort -n
nginx.access.log 爲nginx訪問日誌文件所在路徑code
會到以下結果,前面是ip的訪問次數,後面是ip,很明顯咱們須要把訪問次數多的ip而且不是蜘蛛的ip屏蔽掉,以下面結果,
若 66.249.79.84 不爲蜘蛛則須要屏蔽:
89 106.75.133.167 90 118.123.114.57 91 101.78.0.210 92 116.113.124.59 92 119.90.24.73 92 124.119.87.204 119 173.242.117.145 4320 66.249.79.84
在nginx的安裝目錄下面,新建屏蔽ip文件,命名爲guolv_ip.conf,之後新增長屏蔽ip只需編輯這個文件便可。 加入以下內容並保存:
deny 66.249.79.84 ;
在nginx的配置文件nginx.conf中加入以下配置,能夠放到http, server, location, limit_except語句塊,須要注意相對路徑,本例當中nginx.conf,guolv_ip.conf在同一個目錄中。
include guolv_ip.conf;
保存nginx.conf文件,而後測試如今的nginx配置文件是不是合法的:
nginx -t
若是配置沒有問題,就會輸出:
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok configuration file /usr/local/nginx/conf/nginx.conf test is successful
若是配置有問題就須要檢查下哪兒有語法問題,若是沒有問題,須要執行下面命令,重載 nginx 配置文件:
service nginx reload
三、注意:
屏蔽ip的配置文件既能夠屏蔽單個ip,也能夠屏蔽ip段,或者只容許某個ip或者某個ip段訪問。
//屏蔽單個ip訪問 deny IP; //容許單個ip訪問 allow IP; //屏蔽全部ip訪問 deny all; //容許全部ip訪問 allow all; //屏蔽整個段即從123.0.0.1到123.255.255.254訪問的命令 deny 123.0.0.0/8 //屏蔽IP段即從123.45.0.1到123.45.255.254訪問的命令 deny 124.45.0.0/16 //屏蔽IP段即從123.45.6.1到123.45.6.254訪問的命令 deny 123.45.6.0/24 //若是你想實現這樣的應用,除了幾個IP外,其餘所有拒絕, //那須要你在guolv_ip.conf中這樣寫 allow 1.1.1.1; allow 1.1.1.2; deny all;
單獨網站屏蔽IP的方法,把include guolv_ip.conf; 放到網址對應的在server{}語句塊, 全部網站屏蔽IP的方法,把include guolv_ip.conf; 放到http {}語句塊。