一、控制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个请求排队等待
}
}
******************************我也想难过的时候到海边走走,可是我的城市没有海。******************************