之前总结了一下通过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