Nginx對同一IP限速限流

2021-08-07 02:55:57 字數 1385 閱讀 2096

nginx通過limit_conn_zone和limit_req_zone對同乙個ip位址進行限速限流,可防止ddos/cc和flood攻擊,這類文章網上比較多,但是limit_req_zone中burst漏桶原理說得清楚的卻很少。

limit_conn_zone是限制同乙個ip的連線數,而一旦連線建立以後,客戶端會通過這連線傳送多次請求,那麼limit_req_zone就是對請求的頻率和速度進行限制。

首先看看限制連線數,在nginx的http配置如下:

limit_conn_zone $binary_remote_address zone=addr:10m;

然後在nginx的server段配置如下:

limit_conn addr 2;

這裡兩行雖然不是在一起配置,它們之間通過addr這個變數名聯絡在一起。你可以對某個目錄或指定字尾比如.html或.jpg進行併發連線限制,因為不同資源連線數是不同的,對於主要的.html檔案併發數是兩個就夠了,但是乙個html頁面上有多個jpg/gif資源,那麼併發兩個肯定是不夠,需要加大連線數,但是也不能太大。

有了連線數限制,相當於限制了客戶端瀏覽器和nginx之間 的管道個數,那麼瀏覽器通過這個管道運輸請求,如同向自來水管中放水,水的流速和壓力對於管道另外一端是有影響的。為了防止不信任的客戶端通過這個管道瘋狂傳送請求,對我們的耗cpu的資源url不斷發出狂轟濫炸,必須對請求的速度進行限制,如同對水流速度限制一樣。

在nginx.conf的http段配置:

limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;

在nginx.conf的server段配置

limit_req zone=one burst=10;

這裡引入burst漏桶原理,結合rate速率每秒5個請求(rate=5r/s)解釋如下:

上述使用預設延時也就是佇列的方式對於乙個頁面如果有很多資源需要載入,那麼通過排隊延時載入無疑對伺服器衝擊小,而且防止攻擊者對同乙個資源發出很多請求。

如果我們使用nodelay:

limit_req zone=one burst=10 nodelay;

這表示,如果每秒請求在5-10個之間會盡快完成,也就是以每秒10個速率完成,超過每秒10+5也就是15個就立即返回503,因此nodelay實際沒有了延時,也就取消了佇列等候過渡。

在twitter facebook linkedin這類大型**中,由於訪問量巨大,通常會在http伺服器後面放置乙個訊息佇列,比如apache kafka,用來排隊大量請求,因此,對於中小型**,推薦使用delay方案,而不要寫明nodelay,但是網路上其他各種文章幾乎都是推薦nodelay.

最後乙個頻寬限制,如下:

limit_rate 50k;limit_rate_after 500k;

**:

Nginx對同一IP限速限流

limit conn zone是限制同乙個ip的連線數,而一旦連線建立以後,客戶端會通過這連線傳送多次請求,那麼limit req zone就是對請求的頻率和速度進行限制。limit conn zone binary remote address zone addr 10m limit conn a...

Nginx對同一IP限速限流

limit conn zone是限制同乙個ip的連線數,而一旦連線建立以後,客戶端會通過這連線傳送多次請求,那麼limit req zone就是對請求的頻率和速度進行限制。limit conn zone binary remote address zone addr 10m limit conn a...

nginx限速限流限併發防止攻擊

limit conn zone在http模組內定義,在http server location塊內使用 主要用來限制同乙個ip能與伺服器建立多少個tcp連線 為什麼不說http連線,因為http連線就是基於tcp ip協議的,真正限制的是tcp鏈結數 定義鏈結數限制記憶體塊,以ip位址為key,記憶...