请求因http状态503失败_接入层限流之ngx_http_limit_conn_module

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:

2652ecb94157c472b690ad973b83bb82.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:

56b8706452925733e43f1204bf949b3b.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错误,这样的话,可以在前端启用该模块,要么就是设置白名单。

d422946a2e6f34c7ddc09c54f70744a9.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值