控制nginx并发链接数量和客户端请求nginx的速率

一、控制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;
上下文httpserverlocation
用于指定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个请求排队等待
        }

}
原文地址:https://www.cnblogs.com/Mr-Ding/p/9611586.html