Nginx 的 ngx_http_limit_conn_module、ngx_http_limit_req_module中的limit相关配置参数ngx_http_limit_req_module 模块(nginx 自带本模块除非编译时使用了–without-http_limit_req_module)
本模块基于漏斗算法(Leaky Bucket)
这两种是常见的流速的控制方法。
实例配置
nginx 配置文件增加配置,为方便测试我将limit_req_zone、limit_req放在http段,使其全局生效。 http { ... limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; limit_req zone=one burst=5 nodelay; ... 参数说明: 第一段:
令牌桶算法的基本过程如下:
注意:令牌桶算法不能与另外一种常见算法“漏斗算法(Leaky Bucket)”相混淆。这两种算法的主要区别在于“漏斗算法”能够强行限制数据的传输速率,而“令牌桶算法”在能够限制数据的平均传输数据外,还允许某种程度的突发传输。在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,因此它适合于具有突发特性的流量。 关于添加或不添加burst、nodelay的区别: 请参考:https://blog.csdn.net/hellow__world/article/details/78658041 ngx_http_limit_conn_module (nginx 自带本模块除非编译时使用了–without-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=one:10m; 注释: 客户端的IP地址作为键。注意,这里使用的是 binary_remote_addr 变量,而不是 remote_addr 变量。 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 该指令指定每个给定键值的最大同时连接数,当超过这个数字时返回503(Service )错误。如(同一IP同一时间只允许有20个连接)limit_conn one 20; 使用注意事项
事务都具有两面性的。ngx_http_limit_conn_module 模块虽说可以解决当前面临的并发问题,但是会引入另外一些问题的。如前端如果有做LVS或反代,而我们后端启用了该模块功能,那不是非常多503错误了?这样的话,可以在前端启用该模块,要么就是设置白名单。 |