nginx配置系列(五)限制连接数

举报
炒香菇的书呆子 发表于 2022/05/03 10:07:04 2022/05/03
【摘要】 ngx_http_limit_conn_module 模块该模块一般应用在以下场景:①、秒杀、抢购并发限制②、下载带宽限制③、防止攻击详细说明:ngx_http_limit_conn_module 模块对于一些服务器流量异常、负载过大,甚至是大流量的恶意攻击访问等,进行并发数的限制。该模块可以根据定义的键来限制每个键值的连接数。并不是所有的连接都被计算在内,只有当服务器处理了一个请求,并且...

ngx_http_limit_conn_module 模块

该模块一般应用在以下场景:

①、秒杀、抢购并发限制

②、下载带宽限制

③、防止攻击

详细说明:

ngx_http_limit_conn_module 模块对于一些服务器流量异常、负载过大,甚至是大流量的恶意攻击访问等,进行并发数的限制。该模块可以根据定义的键来限制每个键值的连接数。并不是所有的连接都被计算在内,只有当服务器处理了一个请求,并且整个请求头已经被读取时,才会计算连接。

该模块提供了两个配置参数,limit_conn_zone 和 limit_conn ,其中 limit_conn_zone 只能配置在 http段,而 limit_conn 则可以配置于http、server、location 段中。

一、limit_conn_zone

语法:limit_conn_zone $variable zone=name:size;

配置段:http

参数说明:

  • $variable:定义的键,要限流的维度;
  • zone=name: 定义区域名称(名称随意起名),主要作用与后面的 limit_conn中对应就好。
  • size: 定义各个键共享内存空间大小。

该指令描述会话状态存储区域。键的状态中保存了当前连接数,键的值可以是特定变量的任何非空值(空值不会被考虑)。比如有以下配置示例:

#限制连接数``limit_conn_zone $binary_remote_addr zone=``test``:20m;

注释:

①、客户端的ip地址作为键。注意,这里使用的是 $binary_remote_addr 变量,而不是 $remote_addr 变量。 $binary_remote_addr 变量作用是 获取二进制格式的客户端地址。而 r e m o t e a d d r 变量的作用是获取客户端的 i p 地址。 remote_addr 变量的作用是 获取客户端的ip地址。 binary_remote_addr 和 $remote_addr 这两个变量是nginx中的众多内置变量中的两个。

②、$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位的状态。

⑤、如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。

二、limit_conn

语法:limit_conn zone_name number

配置段:http、server、location

参数说明:

  • zone_name:是上面limit_conn_zone 中的zone定义的(在本篇博文中也就是test)。
  • number:是并发连接数量。

该指令指定每个给定键值的最大同时连接数,当超过这个数字的时候会返回503(Service )错误。limit_conn是对某个key对应的总的网络连接数进行限流。可以按照IP来限制IP维度的总连接数,或者按照服务域名来限制某个域名的总的连接数。(只有那些被nginx处理的且已经读取了整个请求头的请求连接才会被计数器统计)。如(同一IP同一时间只允许有20个连接):

n1.png

三、配置使用示例

limit_conn_zone $binary_remote_addr zone=test:20m;

主要用来定义变量、zone名称、共享内存大小

limit_conn test 20;

将前面定义的test进行配置,并且限制同一IP并发连接数为20

示例截图如下:

n2.png

配置方法如下:

①、在nginx.conf里的http{}里加上如下代码:

#以下参数根据各自需求进行对应的选取配置,不是把下面列出的2行配置代码都复制到对应的http段里面去的。` `limit_conn_zone $binary_remote_addr zone=perip:10m;``limit_conn_zone $server_name zone=perserver:10m;

②、在需要限制并发数和下载带宽的网站配置server{}里加上如下代码:

#以下参数根据各自需求进行对应的选取配置,不是把下面列出的3行配置代码都复制到对应的server段里面去的。` `limit_conn perip 2;``limit_conn perserver 20;``limit_rate 100k;

补充说明下参数:

$binary_remote_addr 是限制同一客户端ip地址。

$server_name 是限制同一server最大并发数。

limit_conn 为限制并发连接数。

limit_rate 为限制下载速度。

四、注意事项

事务都具有两面性的。ngx_http_limit_conn_module 模块虽说可以解决当前面临的并发问题,但是会引入另外一些问题的。如前端如果有做LVS或反代,而我们后端启用了该模块功能,那不是非常多503错误了?这样的话,可以在前端启用该模块,要么就是设置白名单。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。