1. 程式人生 > >Nginx限制訪問速率和最大併發連線數模組--limit (防止DDOS攻擊)

Nginx限制訪問速率和最大併發連線數模組--limit (防止DDOS攻擊)

Nginx限制訪問速率和最大併發連線數模組–limit (防止DDOS攻擊)

Tengine版本採用http_limit_req_module進行限制

和官方nginx類似,不過支援多個變數,並且支援多個limit_req_zone的設定。比如:

limit_req_zone $binary_remote_addr zone=one:3m rate=1r/s;
limit_req_zone $binary_remote_addr $uri zone=two:3m rate=1r/s;               # $uri:不帶客戶端請求引數
limit_req_zone $binary_remote_addr
$request_uri zone=thre:3m rate=1r/s; # $request_uri:帶客戶端請求

引數

上面的第二個指令表示當相同的ip地址並且訪問相同的uri,會導致進入limit req的限制(每秒1個請求)。

Nginx官方版本限制IP的連線和併發分別有兩個模組:
點選以下超連結可檢視對應模組的官方詳細介紹
limit_req_zone 用來限制單位時間內的請求數,即速率限制,採用的漏桶演算法 “leaky bucket”
limit_req_conn 用來限制同一時間連線數,即併發限制
其中limit_req_conn模組可以根據源IP限制單使用者併發訪問的連線數或連線到該服務的總併發連線數

什麼是漏桶演算法?

我們假設系統是一個漏桶,當請求到達時,就是往漏桶裡“加水”,而當請求被處理掉,就是水從漏桶的底部漏出。水漏出的速度是固定的,當“加水”太快,桶就會溢位,也就是“拒絕請求”。從而使得桶裡的水的體積不可能超出桶的容量。​主要目的是控制資料注入到網路的速率,平滑網路上的突發流量。漏桶演算法提供了一種機制,通過它,突發流量可以被整形以便為網路提供一個穩定的流量。

示例如下:

http {
    limit_conn_log_level error;
    limit_conn_status 503;
    limit_conn_zone $binary_remote_addr
zone=one:10m; limit_conn_zone $server_name zone=perserver:10m; limit_req_zone $binary_remote_addr zone=allips:100m rate=10r/s; 其中$binary_remote_addr有時需要根據自己已有的log_format變數配置進行替換 server { ……………………. limit_conn one 100; limit_conn perserver 1000; limit_req zone=allips burst=5 nodelay; …………………. } }

引數解釋:

Zone=one或allips 表示設定了名為“one”或“allips”的儲存區,大小為10兆位元組
rate=10r/s 的意思是允許1秒鐘不超過10個請求
burst=5 表示最大延遲請求數量不大於5。 如果太過多的請求被限制延遲是不需要的 ,這時需要使用nodelay引數,伺服器會立刻返回503狀態碼。
limit_conn one 100表示最大併發連線數100
limit_conn perserver 1000表示該服務提供的總連線數不得超過1000,超過請求的會被拒絕

示例如下:

http {
    limit_req_zone $binary_remote_addr zone=one:100m   rate=10r/m;
    server {
        …………………….
        …………………….
        limit_req   zone=one  burst=1  nodelay;
        ………………….
    }
}

rate=10r/m 的意思是允許1秒鐘不超過1個請求,最大延遲請求數量不大於5.
如果請求不需要被延遲,新增nodelay引數,伺服器會立刻返回503狀態碼。如果沒有該欄位會造成大量的tcp連線請求等待。

http{
    limit_zone one  $binary_remote_addr  10m;
    server
    {
        ......
        limit_conn  one  1;
        ......
    }
}

這裡的 one 是宣告一個 limit_zone 的名字,$binary_remote_addr是替代 $remore_addr的變數,10m 是會話狀態儲存的空間
limit_conn one 1 ,限制客戶端併發連線數量為1, allow only one connection per an IP address at a time(每次).

按照字面的理解,lit_req_zone的功能是通過漏桶原理來限制使用者的連線頻率,(這個模組允許你去限制單個地址指定會話或特殊需要的請求數 )
而 limit_zone 功能是限制一個客戶端的併發連線數。(這個模組可以限制單個地址的指定會話或者特殊情況的併發連線數)
一個是限制併發連線一個是限制連線頻率,表面上似乎看不出來有什麼區別,那就看看實際的效果吧~~~
在我的測試機上面加上這兩個引數下面是我的部分配置檔案

http{
    limit_zone one  $binary_remote_addr  10m;
    #limit_req_zone  $binary_remote_addr  zone=req_one:10m rate=1r/s;
    server
    {
        ......
        limit_conn   one  1;
        #limit_req   zone=req_one  burst=120;
        ......
    }
}

解釋一下 limit_zone one $binary_remote_addr 10m;
這裡的 one 是宣告一個 limit_zone 的名字,$binary_remote_addr是替代 $remore_addr的變數,10m是會話狀態儲存的空間
limit_conn one 1 ,限制客戶端併發連線數量為1

limit_zone兩種工作情況

  1. limit_reqzone=one burst=10 ;
    i.預設情況下是這樣配置的,這樣每個請求就會有一個delay時間,
    limit_req_zone$binary_remote_addr zone=one:100m rate=10r/m;
    就是每分鐘有10個令牌供使用者使用,按照a的配置情況,就會有一個delay,每個請求時間就是60/10,那每個請求時間就是6s。
  2. limit_reqzone=one burst=10 nodelay;
    a). 新增nodelay配置,這樣就是根據你的網路狀況訪問,一分鐘訪問夠10次後,伺服器直接返回503。
    b). Eg:imit_req_zone$binary_remote_addr zone=one:100m rate=10r/m;
    就是每分鐘有10個令牌供使用者使用,按照b的配置情況,就會根據網路情況訪問url,如果一分鐘超過10個令牌,伺服器返回503,等待下一個一分鐘領取訪問令牌。
    rate=10r/m 的意思是每個地址每分鐘只能請求10次,也就是說根據漏桶原理burst=1 一共有1塊令牌,並且每分鐘只新增10塊令牌,
    1塊令牌發完後多出來的那些請求就會返回503
    加上 nodelay之後超過 burst大小的請求就會直接返回503,如果沒有該欄位會造成大量的tcp連線請求等待。
http{
    ...
    #定義一個名為allips的limit_req_zone用來儲存session,大小是10M記憶體,
    #以$binary_remote_addr 為key,限制平均每秒的請求為20個,
    #1M能儲存16000個狀態,rete的值必須為整數,
    #如果限制兩秒鐘一個請求,可以設定成30r/m
    limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
    ...
    server{
        ...
        location {
            ...
            #限制每ip每秒不超過20個請求,漏桶數burst為5
            #brust的意思就是,如果第1秒、2,3,4秒請求為19個,
            #第5秒的請求為25個是被允許的。
            #但是如果你第1秒就25個請求,第2秒超過20的請求返回503錯誤。
            #nodelay,如果不設定該選項,嚴格使用平均速率限制請求數,
            #第1秒25個請求時,5個請求放到第2秒執行,
            #設定nodelay,25個請求將在第1秒執行。
            limit_req zone=allips burst=5 nodelay;
            ...
        }
        ...
    }
    ...
}

限制下載速度:

location /download { 
    limit_rate 128k; 
  } 

如果想設定使用者下載檔案的前10m大小時不限速,大於10m後再以128kb/s限速可以增加以下配內容,修改nginx.conf檔案

location /download { 
       limit_rate_after 10m; 
       limit_rate 128k; 
 }  

相關推薦

Nginx限制訪問速率併發連線模組--limit (防止DDOS攻擊)

Nginx限制訪問速率和最大併發連線數模組–limit (防止DDOS攻擊) Tengine版本採用http_limit_req_module進行限制 和官方nginx類似,不過支援多個變數,並且支援多個limit_req_zone的設定。比如:

nginx併發連線的思考:worker_processes、worker_connections、worker_rlimit_nofile

無論是看過的nginx有關書還是網上看到的有關nginx 配置說明的文章(http://wiki.nginx.org/EventsModule#worker_connections),無一例外,在講到 worker_connections 和 max_clients這兩個概念的關係時都一致的一筆帶過

Apache的工作模式併發請求設定

什麼是apache的工作模式? 個人理解:apache的工作模式就是apache在執行時候的記憶體分配,程序和執行緒的使用方式。舉個例子:一臺apache正在執行的伺服器,如果有個使用者訪問這個apache,那麼apache是啟用一個程序來處理使用者的請求呢?還是在已有的

IIS併發連線

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MySQL檢視併發連線

MySQL檢視最大併發連線數 MySQL效能相關 最大併發連線數檢視 :show variables like ‘%max_connections%’; 重新設定最大併發連線數:set global max_connections=1000 修改/etc/my.cn

iis併發連線、佇列長度、併發執行緒工作程序數

最大併發連線數:  1、影響因素: a.網站html請求,html中的圖片資源,html中的指令碼資源,其他需要連線下載的資源等等,任何一個資源的請求即一次連線(雖然有的資源請求連線響應很快) b.如果網頁採用框架(框架內部巢狀網頁請求),那麼一個框架即一次連線 c.

mysql併發連線設定

mysql > show variables like ’max_connections‘; +-----------------+-------+ | Variable_name   | Value | +-----------------+-------+ | max_connections |

Tomcat併發優化,修改service.xml效能調優 增加併發連線

可以在控制檯的啟動資訊裡看見,預設狀態下沒有被開啟nio配置,啟動時的資訊,如下: 2010-2-1 12:59:40 org.apache.coyote.http11.Http11Protocol init 資訊: Initializing Coyote HTTP/1.1 on http-8080 2010

Tomcat 7併發連線的正確修改方法

這是個很簡單的問題,但是搜了一圈,發現大家都寫錯了。所以這裡總結一下: 幾乎所有的中文網頁都介紹,要修改Tomcat的預設最大併發連線數,應該進行如下設定(實際上這些步驟是錯誤的): ----------------------------------------

Apache優化:修改併發連線

Apache是一個跨平臺的web伺服器,由於其簡單高效、穩定安全的特性,被廣泛應用於計算機技術的各個領域。現在,Apache憑藉其龐大的使用者數,已成為使用者數排名第一的web伺服器。 儘管如此,在實際的生產環境中,我們仍然不可能直接使用預設配置的Apache來充當伺服

Tomcat修改service.xml效能調優 增加併發連線

 詳細配置: <Connector executor="tomcatThreadPool"                port="80" protocol="HTTP/1.1"                 connectionTimeout="20000"

修改XP併發連線的方法(非大半開連線

最近寫了一個EPOLL的server,正在用WINDOWS下的多執行緒程式做壓力測試,一個程序開500個執行緒,連線到SERVER併發送少量資料,但在XP系統上,在開到第8個程序的時候連線成功數目總是小於500,也就是說整個系統能供使用者主動開啟的連線數不到4000個,在網上

Tomcat的配置併發連線

幾乎所有的中文網頁都介紹,要修改Tomcat的預設最大併發連線數,應該進行如下設定(實際上這些步驟是錯誤的): -------------------------------------------- 在tomcat配置檔案server.xml中的<Connec

Nginx 限制訪問速率

並發 修改 body clas onf 說明 con gin class 本文測試的nginx版本為nginx version: nginx/1.12.2 Nginx 提供了 limit_rate 和limit_rate_after,舉個例子來說明一下在需要限速的站點 se

設定springboot自帶tomcat的連線併發

從原始碼來看,最大連線數和最大併發數預設是10000和200 可以通過工程下的application.yml配置檔案來改變這個值 server:   tomcat:     uri-enco

CentOS修改ulimit(程序數檔案開啟)

ulimit -n和-u可以檢視linux的最大程序數和最大檔案開啟數。 臨時方法: 為了優化linux效能,可能需要修改這個最大值。臨時修改的話ulimit -n 204800就可以了,重啟後失效。 永久生效的方法: 修改/etc/security/limits.con

linux系統TCP連線限制

本部落格為轉載,原文請參見<a href="http://blog.51cto.com/jschu/1755279">http://blog.51cto.com/jschu/1755279</a> web伺服器和cache伺服器,高併發下,socke

伺服器TCP連線及調優彙總 BIO,NIO,AIO的理解

啟動執行緒數: 啟動執行緒數=【任務執行時間/(任務執行時間-IO等待時間)】*CPU核心數 最佳啟動執行緒數和CPU核心數量成正比,和IO阻塞時間成反比。如果任務都是CPU計算型任務,那麼執行緒數最多不超過CPU核心數,因為啟動再多執行緒,CPU也來不及排程;相反如果是任務需要等待磁碟操作,網路響應,那

遠端桌面提示 “終端伺服器超出了允許連線” 的解決方法

使用 windows 的遠端桌面連線 windows server 系統,有時候會出現 “終端伺服器超出了最大允許連線數” 的問題。 1 分析 因為 windows 終端服務的預設連結數為 2 個連結,而且當登入桌面後是直接關閉遠端桌面視窗,那麼實際上終

單機TCP連線

今天寫程式用到epoll的模型,翻出原先的程式碼跑了一下,看到原來define的最大的處理使用者上限,感覺有些不妥,所以決定測試一下我的ubuntu 16.04,1G記憶體的單機上究竟可以建立多少個連線。雖然網上有很多這方面的案例,但是我還是決定自己測試一下,印象深刻,對問題