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,如需轉載請自行聯系原作者