1. 程式人生 > >控制nginx並發鏈接數量和客戶端請求nginx的速率

控制nginx並發鏈接數量和客戶端請求nginx的速率

區域 自帶 available 位置 remote root clas php 客戶

一、控制nginx並發鏈接數

ngx_http_limit_conn_module這個模塊用於限制每個定義的key值的鏈接數,特別是單IP的鏈接數。

不是所有的鏈接數都會被計數,一個符合計數要求的連接數是整個請求頭已經被讀取的鏈接數。

控制nginx並發鏈接數量參數的說明如下:

1)、limit_conn_zone參數:
語法: limit_conn_zone key zone=name:size;
上下文http
用於設置共享內存區域,key可以是字符串、 nginx自帶變量或前兩個組合,如$binary_remote_addr、$server_name。name為內存區域的名稱,size為內存區域的大小。

2) limit_conn參數:
語法: limit_conn_zone_number;
上下文http\server\location
用於指定key設置最大連接數。當超過最大連接數時,服務器會返回503( Service Temporarily Unavailable)錯誤。

1)、限制單IP並發鏈接數

nginx的配置文件如下:

[root@nginx conf]# cat nginx.conf
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;
user www;

events {
	use epoll;
    worker_connections  20480;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server_tokens off;
    keepalive_timeout  65;
	
    limit_conn_zone $binary_remote_addr zone=addr:10m;
        ...
        ...
     
     server {
        listen       80;
        server_name  www.dmtest.com;
        location / {
            root   html;
            index  index.php index.html index.htm;  
	    limit_conn addr 1;    #限制單IP的並發鏈接為1
        }

}

2)、限制虛擬主機總鏈接數

不僅可以限制單IP的並發鏈接數,還可以限制虛擬主機總鏈接數,甚至可以對兩者同時限制,nginx的配置文件如下:

[root@nginx conf]# cat nginx.conf
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;
user www;

events {
	use epoll;
    worker_connections  20480;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server_tokens off;
    keepalive_timeout  65;
	
    limit_conn_zone $binary_remote_addr zone=addr:10m;
	limit_conn_zone $binary_name zone=perserver:10m;
        ...
        ...
     
     server {
        listen       80;
        server_name  www.dmtest.com;
        location / {
            root   html;
            index  index.php index.html index.htm;  
	    limit_conn perserver 1;    #限制虛擬主機連接數為2
        }

}

二、控制客戶端請求nginx的速率

ngx_http_limit_req_module模塊用於限制每個IP訪問每個定義key的請求速率。
limit_req_zone參數說明如下:
語法: limit_req_zone key zone=name:size rate=rate;
上下文:http
用於設置共享內存區域,key可以是字符串、 nginx自帶變量或前兩個組合,如$binary_remote_addr。 name為內存區域的名稱,size為內存區域的大小,rate為速率,單位為r/s,每秒一個請求。

limit_req參數說明如下:
語法: limit_req zone=name [burst=number] [nodelay];
上下文:http、 server、 location
這裏運用了令牌桶原理, burst=num,一共有num塊令牌,令牌發完後,多出來的那些請求就會返回503。
換句話說,一個銀行,只有一個營業員,銀行很小,等候室只有5個人的位置。因此,營業員一個時刻只能為一個人提供服務,剩下的不超過5個人可以在銀行內等待,
超出的人不提供服務,直接返回503。
nodelay默認在不超過 burst值的前提下會排隊等待處理,如果使用此參數,就會處理完num+1次請求,剩余的請求都視為超時,返回503。

配置如下:

[root@nginx conf]# cat nginx.conf
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;
user www;

events {
	use epoll;
    worker_connections  20480;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server_tokens off;
    keepalive_timeout  65;
	
    limit_conn_zone $binary_remote_addr zone=addr:10m rate=1r/s;
	#以請求的客戶端IP作為key值,內存區域命名為noe,分配10m內存空間,訪問速率限制為1秒1次請求(request)
        ...
        ...
     
     server {
        listen       80;
        server_name  www.dmtest.com;
        location / {
            root   html;
            index  index.php index.html index.htm;  
	    limit_conn perserver 1;
		#使用前面定義的名為one的內存空間,隊列值為5,即可以有5個請求排隊等待
        }

}

控制nginx並發鏈接數量和客戶端請求nginx的速率