使用nginx以头文件中的自定义参数为标记进行限流

10 篇文章 0 订阅

之前总结了一下通过nginx中以ip为标记进行限流的方法
nginx限流配置

今天遇到一个问题:ip是固定的几个,但是每个请求可能不同,这就导致使用ip为标记进行限流显然不合适,可以通过请求头中的其他参数为标记进行限流。比如头文件中的自定义参数
比如头文件中有x-signature和x-deliverid两个自定义参数,我们希望对这两个参数进行限流
例:

# /etc/nginx/nginx.conf
http {
	...
	# 限制并发连接
	limit_conn_zone $http_x_deliverid zone=addr_deliverid:1m;
	limit_conn_zone $http_x_signature zone=addr_signature:1m;
	# 限制连接速率为1r/s
	limit_req_zone  $http_x_deliverid zone=one_deliverid:1m rate=1r/s;
	limit_req_zone  $http_x_signature zone=one_signature:1m rate=1r/s;
    # 开启对带下划线的自定义请求头参数支持
    underscores_in_headers on;
	...
}
# /etc/nginx/sites-enabled/default
server {
	...
    location / {
        ...
        # 限制并发连接数为1
        limit_conn addr_deliverid 1;
        limit_conn addr_signature 1;
        # 允许超过频率限制的请求数不多于5个
        limit_req zone=one_deliverid burst=5;
        limit_req zone=one_signature burst=5;
		...
    }
}

记住一定要使用“underscores_in_headers on;”开启对带下划线的自定义请求头参数的支持,否则参数会被过滤掉

测试:
代码地址:https://github.com/MacwinWin/nginx_testing/tree/main/2021-03-25

>>> go-stress-testing-linux -c 10 -n 2 -H 'X-Signature: 123' -H 'X-DeliverId: 123' -u 'http://127.0.0.1:8964/pid/1/production_page
Restarted supervisord

 开始启动  并发数:10 请求数:2 请求参数: 
request:
 form:http 
 url:http://127.0.0.1:8964/pid/1/production_page 
 method:GET 
 headers:map[X-DeliverId:123 X-Signature:123] 
 data: 
 verify:statusCode 
 timeout:30s 
 debug:false 



─────┬───────┬───────┬───────┬────────┬────────┬────────┬────────┬────────┬────────┬────────
 耗时│ 并发数│ 成功数│ 失败数│   qps  │最长耗时│最短耗时│平均耗时│下载字节│字节每秒│ 错误码
─────┼───────┼───────┼───────┼────────┼────────┼────────┼────────┼────────┼────────┼────────
   1s│      5│      1│      9│  369.80│    8.00│    0.33│   27.04│   1,856│   1,854│200:1;503:9
   2s│      6│      2│      9│   19.39│ 1004.16│    0.33│  515.60│   1,858│     928│200:2;503:9
   3s│      7│      3│      9│    9.88│ 2003.76│    0.33│ 1011.65│   1,860│     619│200:3;503:9
   4s│      8│      4│      9│    6.63│ 3002.21│    0.33│ 1509.29│   1,862│     465│200:4;503:9
   5s│      9│      5│      9│    4.98│ 4003.34│    0.33│ 2008.10│   1,864│     372│200:5;503:9
   6s│     10│      6│      9│    3.99│ 5003.11│    0.33│ 2507.27│   1,866│     310│200:6;503:9
   7s│     10│      7│      9│    3.49│ 5003.11│    0.33│ 2863.14│   1,868│     266│200:7;503:9
   8s│     10│      8│      9│    3.19│ 5003.11│    0.33│ 3130.26│   1,870│     233│200:8;503:9
   9s│     10│      9│      9│    3.00│ 5003.11│    0.33│ 3338.01│   1,872│     207│200:9;503:9
  10s│     10│     10│      9│    2.85│ 5003.11│    0.33│ 3504.15│   1,874│     187│200:10;503:9
  10s│     10│     11│      9│    2.75│ 5003.11│    0.33│ 3640.19│   1,876│     187│200:11;503:9


*************************  结果 stat  ****************************
处理协程数量: 10
请求总数(并发数*请求数 -c * -n): 20 总请求时间: 10.007 秒 successNum: 11 failureNum: 9
*************************  结果 end   ****************************

参考:
https://blog.csdn.net/xbynet/article/details/51899286
https://blog.csdn.net/TimerBin/article/details/84915862
https://blog.csdn.net/orangleliu/article/details/51253232

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值