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有一定的防禦作用。
限頻寬很容易明白,直接上例子
location /mp3 {limit_rate 200k;}
有一種方式可以讓限速更加人性化,即傳輸一定流量後開始限速,
比如先全速傳輸1M,然後開始限速:
location /photo {limit_rate_after 1m;limit_rate 100k;}
接下來講限並發數和請求數。
為什麼有這兩個模組呢?因為我們知道,一個頁面通常有多個子模組,譬如5張圖片,那麼我們請求這個頁面時發起了一個串連,但是這一個串連包含了5次圖片請求,也就是說,一個串連可以發起多次請求。我們為了維持使用者體驗,是限制串連數還是請求數,要根據實際需要進行選擇。
1、限制串連數
要限制串連,必須先有一個容器對串連進行計數,在http段加入如下代碼:
limit_conn_zone $binary_remote_addr zone=addr:5m;
這樣就在記憶體中建立了一個5M大小,名為addr的限速池(每個串連佔用32或64位元組,5m大小可容納數以萬計的串連,通常是足夠的,如果5M記憶體耗盡,將返回503)
接下來需要對server不同的位置(location段)進行限速,比如限制每個IP並發串連數為2,則
limit_conn addr 2;
2、限制請求數
要限制請求數,也必須先建立一個限速池,在http段加入如下代碼:
limit_req_zone $binary_remote_addr zone=one:5m;
限速分為全域限速和局部限速,
對於全域限速,我們只需要在後面加上參數即可,比如每秒20個請求,rate=20r/s,即:
limit_req_zone $binary_remote_addr zone=perip:5m rate=20r/s;
有時候我們希望在location段調整一下連結,可以藉助burst參數
limit_req zone=one burst=50;
如果不希望延時,還有nodelay參數
limit_req zone=one burst=50 nodelay;
以上是nginx的限速功能簡介,不當之處,歡迎指正。至於具體使用哪種限速方法,一定要斟酌,以免破壞使用者體驗。
參考文章
http://wiki.nginx.org/HttpCoreModule#limit_rate
http://nginx.org/cn/docs/http/ngx_http_limit_req_module.html
http://nginx.org/cn/docs/http/ngx_http_limit_conn_module.html
http://wiki.nginx.org/HttpLimitConnModule
http://wiki.nginx.org/HttpLimitReqModule
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_limit_conn_module.html#limit_zone
本文出自 “Purple_Grape的部落格” 部落格,請務必保留此出處http://purplegrape.blog.51cto.com/1330104/1228527