nginx 配置系列(五)限制连接数
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: 定义各个键共享内存空间大小。
该指令描述会话状态存储区域。键的状态中保存了当前连接数,键的值可以是特定变量的任何非空值(空值不会被考虑)。比如有以下配置示例:
注释:
①、客户端的 ip 地址作为键。注意,这里使用的是 remote_addr 变量。 remote_addr 变量的作用是 获取客户端的 ip 地址。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 个连接):
三、配置使用示例
limit_conn_zone $binary_remote_addr zone=test:20m;
主要用来定义变量、zone 名称、共享内存大小
limit_conn test 20;
将前面定义的 test 进行配置,并且限制同一 IP 并发连接数为 20
示例截图如下:
配置方法如下:
①、在 nginx.conf 里的 http{}里加上如下代码:
②、在需要限制并发数和下载带宽的网站配置 server{}里加上如下代码:
补充说明下参数:
$binary_remote_addr 是限制同一客户端 ip 地址。
$server_name 是限制同一 server 最大并发数。
limit_conn 为限制并发连接数。
limit_rate 为限制下载速度。
四、注意事项
事务都具有两面性的。ngx_http_limit_conn_module 模块虽说可以解决当前面临的并发问题,但是会引入另外一些问题的。如前端如果有做 LVS 或反代,而我们后端启用了该模块功能,那不是非常多 503 错误了?这样的话,可以在前端启用该模块,要么就是设置白名单。
版权声明: 本文为 InfoQ 作者【乌龟哥哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/d1cb64cd4d07cabc7000bb63d】。文章转载请联系作者。
评论