一.Nginx的请求限制
我们经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制。http_ limit_ conn_ module 模块来实现。该模块可以根据定义的键来限制每个键值的连接数,如同一个IP来源的连接数。并不是所有的连接都会被该模块计数,只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数。http_ limit_ req_ module 模块来实现,该模块可以通过定义的 键值来限制请求处理的频率。特别的,可以限制来自单个IP地址的请求处理频率。 限制每秒固定处理请求数,推迟过多请求。
连接频率限制 limit_ conn_ module
请求频率限制 limit_ req_ module
HTTP请求建立在一次TCP连接基础上
一次TCP请求至少产生一次HTTP请求
二.配置语法
1 .http_ limit_ conn_module指令解释
limit_conn_zone
语法: limit_ conn_ zone $variable zone=name:size;
默认值: none
配置段: http
该指令描述会话状态存储区域。键的状态中保存了当前连接数,键的值可以是特定变量的任何非空值( 空值将不会被考虑)。$variable定义键,zone=name定义区域名称,后面的limit_conn指令会用到的。size定义各个键共享内存空间大小。
如:
limit_conn_zone $binary_remote_addr zone=addr:10m;
注释:$binary_ remote_ addr变量用客户端的IP地址作为键 ,如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。
limit_conn_log_level
语法:limit_conn_log_level info | notice | warn | error
默认值:error
配置段:http, server, location
当达到最大限制连接数后,记录日志的等级。
limit_ conn
语法:limit_ conn zone_ name number
默认值:none
配置段:http, server, location
指定每个给定键值的最大同时连接数,当超过这个数字时被返回503 (Service Temporarily Unavailable)错误。
例:
imit_conn_zone $binary_remote_addrzone=addr:10m;
server{
location /{
root /usr/share/nginx/html;
index index.html index.htm;
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;
server {
limit_conn perip 10;
limit_conn perserver 100;
}
2 .ngx_ http_ limit_ req_ module模块指令
limit_ req_ zone
语法: limit_ req_ zone $variable zone=name:size rate=rate;
默认值: none
配置段: http
例:
limit_ req_ zone $binary_remote_addr zone=one:10m rate=1r/s;
区域名称为one,大小为10m,平均处理的请求频率不能超过每秒一次。
键值是客户端IP。
limit_ req
语法: limit_req zone=name [burst=number] [nodelay];
默认值: —
配置段: http, server, location
设置对应的共享内存限制域和允许被处理的最大请求数阈值。 如果请求的频率超过了限制域配置的值,请求处理会被延迟,所以所有的请求都是以定义的频率被处理的。 超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值,这时,这个请求会被终止,并返回503 (Service Temporarily Unavailable) 错误。这个阈值的默认值为0。
例:
limit_req_zone $binary_remote_addr zone=creq:10 mrate=1r/s;
server{
location /{
root /usr/share/nginx/html;
limit_req zone=creq burst=5;
index index.html index.htm;
}
}
//限制平均每秒不超过一个请求,同时允许超过频率限制的请求数不多于5个。如果不希望超过的请求被延迟,可以用nodelay参数,如:
limit_req zone=ttlsa_com burst=5 nodelay;
压力测送:
[root@mysql ~]# ab -c 20 -n 20 http://192.168.0.77/index.html //每秒完成4个请求