天天看點

nginx 限速

nginx 是個不錯的web伺服器,提供了全方位的限速功能,主要的功能子產品是ngx_http_core_module、ngx_http_limit_conn_module和 ngx_http_limit_req_module,第一個子產品中有limit_rate功能(限網速帶寬),後兩個子產品從字面上講,功能分别是限制連接配接(limit connection)和限制請求(limit request),這幾個子產品預設都編譯進了nginx核心。

所有的限制都是針對IP的,是以對CC、DDOS有一定的防禦作用。

限帶寬很容易明白,直接上例子

1

2

3

<code>location /mp3 {</code>

<code>    </code><code>limit_rate 200k;</code>

<code>}</code>

有一種方式可以讓限速更加人性化,即傳輸一定流量後開始限速,

比如先全速傳輸1M,然後開始限速:

4

<code>location /photo {</code>

<code>    </code><code>limit_rate_after 1m;</code>

<code>    </code><code>limit_rate  100k;</code>

接下來講限并發數和請求數。

為什麼有這兩個子產品呢?因為我們知道,一個頁面通常有多個子子產品,譬如5張圖檔,那麼我們請求這個頁面時發起了一個連接配接,但是這一個連接配接包含了5次圖檔請求,也就是說,一個連接配接可以發起多次請求。我們為了維持使用者體驗,是限制連接配接數還是請求數,要根據實際需要進行選擇。

1、限制連接配接數

要限制連接配接,必須先有一個容器對連接配接進行計數,在http段加入如下代碼:

<code>limit_conn_zone $binary_remote_addr zone=addr:5m;</code>

這樣就在記憶體中建立了一個5M大小,名為addr的限速池(每個連接配接占用32或64位元組,5m大小可容納數以萬計的連接配接,通常是足夠的,如果5M記憶體耗盡,将傳回503)

接下來需要對server不同的位置(location段)進行限速,比如限制每個IP并發連接配接數為2,則

<code>limit_conn addr 2;</code>

2、限制請求數

要限制請求數,也必須先建立一個限速池,在http段加入如下代碼:

<code>limit_req_zone $binary_remote_addr zone=one:5m;</code>

限速分為全局限速和局部限速,

對于全局限速,我們隻需要在後面加上參數即可,比如每秒20個請求,rate=20r/s,即:

<code>limit_req_zone $binary_remote_addr zone=perip:5m rate=20r</code><code>/s</code><code>;</code>

有時候我們希望在location段調整一下連結,可以借助burst參數

<code>limit_req zone=one burst=50;</code>

如果不希望延時,還有nodelay參數

<code>limit_req zone=one burst=50 nodelay;</code>

以上是nginx的限速功能簡介,不當之處,歡迎指正。至于具體使用哪種限速方法,一定要斟酌,以免破壞使用者體驗。

本文轉自 紫色葡萄 51CTO部落格,原文連結:http://blog.51cto.com/purplegrape/1228527,如需轉載請自行聯系原作者

繼續閱讀