经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个IP的连接数,请求数、进行限制。
一、ngx_http_limit_conn_module 模块
ngx_http_limit_conn_module 模块用于限制定义key在同一时间的并发连接数,特别是来自单个IP地址的连接数。并非所有连接都被计算在内,仅当连接已经读取了整个请求头时才计算连接。
用法:
该模块提供了四个指令,limit_conn_zone 、 limit_conn 、 limit_conn_log_level 、limit_conn_status
limit_conn_zone 指令
语法: limit_conn_zone $variable zone=name:size;
作用域: http
功能: 定义了一个会话状态存储区域,里边记录会话状态的信息
说明: $variable 使用Nginx内置变量作为键(一般经常使用客户端的IP地址作为键:① $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位的状态)。zone=name定义区域名称(名称随意起,在limit_conn配置项中调用时对应就好),
size定义各个键共享内存空间大小。如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。
limit_conn 指令
语法: limit_conn zone_name number;
作用域: http, server, location
功能: 使用由limit_conn_zone定义的拦截规则, 并设置具体的限制连接数量,当超过这个数字时返回503(Service )错误。即limit_conn是对某个在limit_conn_zone中
定义的存储区域key对应的总的网络连接数进行限流。可以按照IP来限制IP维度的总连接数,或者按照服务域名来限制某个域名的总的连接数。
(只有那些被nginx处理的且已经读取了整个请求头的请求连接才会被计数器统计)。
说明: zone_name是上面 limit_conn_zone 中的zone定义的,即由limit_conn_zone(zone=name)定义的名称; 表示使用定义的哪个限制规则;number:正整数; 表示具体的限制连接数量
limit_conn_log_level 指令
语法: limit_conn_log_level info|notice|warn|error
作用域: http, server, location
默认值: limit_conn_log_level error
功能: 当达到最大限制规则的连接数后,记录日志的等级。
limit_conn_status指令
语法: limit_conn_status code
作用域: http, server, location
默认值: limit_conn_status 503
功能: 当超过限制规则后,返回的响应状态码,默认是503
配置
http{
# http块中定义访问限制
limit_conn_zone $remote_addr zone=conn_zone:10m;
server{
# server块中调用。连接限制,限制同时最高1个连接
limit_conn conn_zone 1