天天看點

nginx限制連接配接數ngx_http_limit_conn_module子產品

我們經常會遇到這種情況,伺服器流量異常,負載過大等等。對于大流量惡意的攻擊通路,會帶來帶寬的浪費,伺服器壓力,影響業務,往往考慮對同一個 ip的連接配接數,并發數進行限制。下面說說ngx_http_limit_conn_module 子產品來實作該需求。該子產品可以根據定義的鍵來限制每個鍵值的連接配接數,如同一個IP來源的連接配接數。并不是所有的連接配接都會被該子產品計數,隻有那些正在被處理的 請求(這些請求的頭資訊已被完全讀入)所在的連接配接才會被計數。

limit_conn_zone

文法: limit_conn_zone $variable zone=name:size;

預設值: none

配置段: http

該指令描述會話狀态存儲區域。鍵的狀态中儲存了目前連接配接數,鍵的值可以是特定變量的任何非空值(空值将不會被考慮)。$variable定義鍵,zone=name定義區域名稱,後面的limit_conn指令會用到的。size定義各個鍵共享記憶體空間大小。如:

1

limit_conn_zone $binary_remote_addr zone=addr:10m;

注釋:用戶端的IP位址作為鍵。注意,這裡使用的是$binary_remote_addr變量,而不是$remote_addr變量。

$remote_addr變量的長度為7位元組到15位元組,而存儲狀态在32位平台中占用32位元組或64位元組,在64位平台中占用64位元組。

$binary_remote_addr變量的長度是固定的4位元組,存儲狀态在32位平台中占用32位元組或64位元組,在64位平台中占用64位元組。

1M共享空間可以儲存3.2萬個32位的狀态,1.6萬個64位的狀态。

如果共享記憶體空間被耗盡,伺服器将會對後續所有的請求傳回 503 (Service Temporarily Unavailable) 錯誤。

limit_zone 指令和limit_conn_zone指令同等意思,已經被棄用,就不再做說明了。

limit_conn_log_level

文法:limit_conn_log_level info | notice | warn | error

預設值:error

配置段:http, server, location

當達到最大限制連接配接數後,記錄日志的等級。

limit_conn

文法:limit_conn zone_name number

預設值:none

指定每個給定鍵值的最大同時連接配接數,當超過這個數字時被傳回503 (Service Temporarily Unavailable)錯誤。如:

2

3

4

5

6

server {

    location /www.ttlsa.com/ {

        limit_conn addr 1;

    }

}

同一IP同一時間隻允許有一個連接配接。

當多個 limit_conn 指令被配置時,所有的連接配接數限制都會生效。比如,下面配置不僅會限制單一IP來源的連接配接數,同時也會限制單一虛拟伺服器的總連接配接數:

limit_conn_zone $binary_remote_addr zone=perip:10m;

limit_conn_zone $server_name zone=perserver:10m;

    limit_conn perip 10;

    limit_conn perserver 100;

[warning]limit_conn指令可以從上級繼承下來。[/warning]

limit_conn_status

文法: limit_conn_status code;

預設值: limit_conn_status 503;

配置段: http, server, location

該指定在1.3.15版本引入的。指定當超過限制時,傳回的狀态碼。預設是503。

limit_rate

文法:limit_rate rate

預設值:0

配置段:http, server, location, if in location

對每個連接配接的速率限制。參數rate的機關是位元組/秒,設定為0将關閉限速。 按連接配接限速而不是按IP限制,是以如果某個用戶端同時開啟了兩個連接配接,那麼用戶端的整體速率是這條指令設定值的2倍。

7

8

9

10

11

12

http {

limit_conn_zone $binary_remote_addr zone=limit:10m;

limit_conn_log_level info;

location  ^~ /download/ {  

limit_conn limit 4;

limit_rate 200k;

alias /data/www.ttlsa.com/download/;

                }

事務都具有兩面性的。ngx_http_limit_conn_module 子產品雖說可以解決目前面臨的并發問題,但是會引入另外一些問題的。如前端如果有做LVS或反代,而我們後端啟用了該子產品功能,那不是非常多503錯誤了? 這樣的話,可以在前端啟用該子產品,要麼就是設定白名單,白名單設定參見後續的文檔,我會整理一份以供讀者參考。

轉載至:http://www.ttlsa.com/nginx/nginx-limited-connection-number-ngx_http_limit_conn_module-module/

本文轉自  亮公子  51CTO部落格,原文連結:http://blog.51cto.com/iyull/1864372

繼續閱讀