nginx 限速之limit_conn的使用
作者:木华思流年
在工作中经常会遇到用户大量请求某个接口和一些大流量的恶意攻击,可以通过nginx对同一个ip的连接数,请求,进行限制.
通过nginx我们有三种限速方式分别是: 限制请求数(request),限制连接数(connection),限制响应速度(rate),分别对应nginx的limit_req,limit_conn和limit_rate三个模块,limit_conn和limit_req模块类似,有许多指令组成一个大的模块,两个模块之间很多指令的命名方式和用法大同小异.
ngx_http_limit_conn_module 模块主要是用于根据特定的key来限制连接的数量,如根据ip地址来限制连接数.需注意的是并不是所有的连接都会被算入其中,只有当一个连接的整个请求头被读取并且已经被nginx服务器处理的时候才会被算入限制中.
1. ngx_http_limit_conn_module模块
1. limit_conn_zone 指令
#语法配置 Syntax: limit_conn_zone key zone=name:size; Defaule: - Context: http #作用域 limit_conn_zone $binary_remote_addr zone=${name}:10m #示例
说明:
- limit_conn_zone: 只能够在http块用使用
- key: 可以设置为$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) 错误。
- name: 就是这个zone的命名,name需要全局唯一,limit_conn 命令根据name来查找对应zone进行相应限制规则的匹配.
- size: 定义这个zone的大小,也就是nginx会在内存中开辟多大的空间来存储这个zone的相应信息,主要和前面定义的key的大小有关系,需要注意的是当内存带下耗尽的时候,nginx会直接返回错误码limit_conn_status给后续的请求(If the zone storage is exhausted, the server will return the error to all further requests.)
2. limit_conn指令
Syntax: limit_conn zone number; #语法 Default: Context: http,server,location #作用域
说明:
- limit_conn: 使用由limit_conn_zone定义的拦截规则,并设置具体的限制连接数量,当超过这个数字时返回503(server)的错误.定义的存储区域key对应的总的网络连接数进行限流。可以按照IP来限制IP维度的总连接数,或者按照服务域名来限制某个域名的总的连接数(只有那些被nginx处理的且已经读取了整个请求头的请求连接才会被计数器统计,在http,server,location三个块中使用,但是要搭配limit_conn_zone使用
- zone: 是在limit_conn_zone中的name变量,对应这全局唯一的zone,负责确定限制连接数的依据
- number: 限制的连接数,zone和number组合就可以完成连接数的限定功能,注意number必须是数字而不能使用变量.
示例:
limit_conn_zone $binary_remote_addr zone=addr:10m; server { location /download/ { limit_conn addr 1; }
3. limit_conn_log_level指令
Syntax: limit_conn_log_level info|notice|warn|error #语法 Default: limit_conn_log_level error; #默认 Context: http, server, location #作用域
功能: 当达到最大限制规则的连接数后,记录日志的等级。会输出到error.log中而不是access.log,调成info的话会有较多的日志输出,需要额外注意硬盘容量等相关问题。
4.limit_conn_status指令
Syntax: limit_conn_status code Context: http, server, location Default: limit_conn_status 503
功能:当超过限制规则后,返回的响应状态码,默认是503,如果是一些有特殊需求的场景,可以手动调整为403之类的状态码,需要注意的是并不是所有的状态码都可以使用,nginx官方限定状态码必须在400到599之间。
5.limit_conn_dry_run指令
Syntax: limit_conn_dry_run on | off; Default: limit_conn_dry_run off; Context: http, server, location This directive appeared in version 1.17.6.
功能: dry_run模式的意义在于试运行而不对线上业务造成影响。设置为on之后,前面的limit_conn指令
并不会真正生效,但是limit_conn_zone指令
会生效,nginx会在内存中存储计算相关的数据.
到此这篇关于nginx 限速之limit_conn的使用的文章就介绍到这了,更多相关nginx limit_conn内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!