接入层限流之ngx_http_limit_conn_module

本文涉及的产品
.cn 域名,1个 12个月
简介: ngx_http_limit_conn_module是Nginx提供的连接数限流模块,是对某个KEY对应的总的网络连接数进行限流。可以按照IP来限制IP维度的总连接数,或者按照服务域名来限制某个域名的总连接数。但不是每一个请求连接都会被计数器统计,只有那些被Nginx处理的且已经读取了整个请求头的请求连接才会被计数器统计。

【转载请注明出处】:https://developer.aliyun.com/article/759766

ngx_http_limit_conn_module是Nginx提供的连接数限流模块,是对某个KEY对应的总的网络连接数进行限流。可以按照IP来限制IP维度的总连接数,或者按照服务域名来限制某个域名的总连接数。但不是每一个请求连接都会被计数器统计,只有那些被Nginx处理的且已经读取了整个请求头的请求连接才会被计数器统计。

配置示例:
http {
    limit_conn_zone $binary_remote_addr zone=addr:10m; 
    limit_conn_log_level error; 
    limit_conn_status 503;
    ...
    server {
    ...
    location /limit {
        limit_conn addr 1;
    }
  • limit_conn:要配置存放KEY和计数器的共享内存区域和指定KEY的最大连接数;此处指定的最大连接数是1,表示Nginx最多同时并发处理1个连接;
  • limit_conn_zone:用来配置限流KEY、及存放KEY对应信息的共享内存区域大小;此处的KEY是$binary_remote_addr,其表示IP地址,也可以使用如$server_name作为KEY来限制域名级别的最大连接数;
    语法是limit_conn_zone $variable zone=name:size;

$variable定义键,zone=name定义区域名称,size定义各个键共享内存空间大小。
$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_status:配置被限流后返回的状态码,默认返回503;
  • limit_conn_log_level:配置记录被限流后的日志级别,默认error级别。
    具体可以参考官方文档说明ngx_http_limit_conn_module
limit_conn的主要执行过程如下:
  1. 请求进入后首先判断当前limit_conn_zone中相应KEY的连接数是否超出了配置的最大连接数;
  2. 如果超过了配置的最大值,则被限流,返回limit_conn_status定义的错误状态码;否则相应KEY的连接数加1,并注册请求处理完成的回调函数;
  3. 进行请求处理;
  4. 在结束请求阶段会调用注册的回调函数对相应KEY的连接数减1。

limt_conn可以限流某个KEY的总并发/请求数,KEY可以根据需要变化。

按照IP限制并发连接数

nginx配置

limit_conn_zone $binary_remote_addr zone=perip:10m; 
limit_conn_log_level info; 
limit_conn_status 503;

server {
    listen       8000;
    server_name  localhost;

    location /limit {
       limit_conn perip 2;
     #  add_header Content-Type "text/plain;charset=utf-8";
     #  return 200 "Your IP:$remote_addr";
       proxy_pass http://127.0.0.1:8081; 
    }

}

允许每个IP最大并发连接数为2。
使用AB测试工具进行测试,并发数为5个,总的请求数为30个:

ab -n 30 -c 5 http://127.0.0.1:8000/limit/test

查看nginx access.log:
image.png

按照域名限制并发连接数

nginx配置

limit_conn_zone $server_name  zone=perserver:10m; 
limit_conn_log_level info; 
limit_conn_status 503;

server {
    listen       8000;
    server_name  localhost;

    location /limit {
       limit_conn perserver 3; 
       proxy_pass http://127.0.0.1:8081; 
    }

}

access.log:
image.png

当多个 limit_conn 指令被配置时,所有的连接数限制都会生效。比如,下面配置不仅会限制单一IP来源的连接数,同时也会限制单一服务器的总连接数:

limit_conn_zone $binary_remote_addr zone=perip:10m; 
limit_conn_zone $server_name zone=perserver:10m; 
limit_conn_log_level info; 
limit_conn_status 503;

server {
    listen       8000;
    server_name  localhost;

    location /limit {
       limit_conn perip 2;
       limit_conn perserver 3;
       proxy_pass http://127.0.0.1:8081; 
    }

}ss

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

【转载请注明出处】:https://developer.aliyun.com/article/759766

相关文章
|
算法 应用服务中间件 测试技术
接入层限流之ngx_http_limit_req_module
ngx_http_limit_req_module模块是Nginx提供的基于漏桶算法实现的请求限流模块,用于对指定KEY对应的请求进行限流,比如按照IP维度限制请求速率。
1448 0
接入层限流之ngx_http_limit_req_module
|
12月前
|
数据采集 缓存 算法
最常用的限流算法以及如何在http中间件中加入流控
最常用的限流算法以及如何在http中间件中加入流控
114 0
|
数据采集 存储 缓存
最常用的限流算法以及如何在http中间件中加入流控 | 周末学习
通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理
190 0
|
算法 Java Maven
【高并发】亿级流量场景下如何为HTTP接口限流?看完我懂了!!
在互联网应用中,高并发系统会面临一个重大的挑战,那就是大量流高并发访问,比如:天猫的双十一、京东618、秒杀、抢购促销等,这些都是典型的大流量高并发场景。关于秒杀,小伙伴们可以参见我的另一篇文章《【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!》 关于【冰河技术】微信公众号,解锁更多【高并发】专题文章。 注意:由于原文篇幅比较长,所以被拆分为:理论、算法、实战(HTTP接口实战+分布式限流实战)三大部分。 理论篇:《【高并发】如何实现亿级流量下的分布式限流?这些理论你必须掌握!!》 算法篇:《【高并发】如何实现亿级流量下的分布式限流?这些算法你必须掌握!!》 项目源码已提交
272 0
【高并发】亿级流量场景下如何为HTTP接口限流?看完我懂了!!
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Datanode的日志中看到: 10/12/14 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYYY from any node: java.
693 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
zookeeper watch的定义如下:watch事件是一次性触发器,当watch监视的数据发生变化时,通知设置了该watch的client,即watcher。
934 0
|
Web App开发 Apache
|
Web App开发 前端开发 Java
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
 Connection reset by peer的常见原因: 1)服务器的并发连接数超过了其承载量,服务器会将其中一些连接关闭;    如果知道实际连接服务器的并发客户数没有超过服务器的承载量,看下有没有网络流量异常。
857 0
|
Web App开发 存储 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
NoSuchObjectException(message:There is no database named cloudera_manager_metastore_canary_test_db_hive_hivemetastore_df61080e04cd7eb36c4336f71b5a8bc4) at org.
1079 0