微服务-限制连接数之openresty limit_conn
1.简介
目的是:限制连接数核心目的是防止恶意请求脚本来刷服务器
官方文档:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
支持http/https,不支持websocket
2.格式
limit_conn_zone $binary_remote_addr zone=perip_conn:10m;
设置zone为perip_conn, 在nginx内存里分配10m的空间来存储
根据实践经验,1MB的空间可以储存16000个IP地址
limit_conn perip_conn 10;
每个ip最多允许10个连接
3. 基于ip限制
3.1. 每个ip限制1个连接数
nginx配置:
ab测试:
1个连接100次测试
sudo ab -n 100 -c 1 -t 10 http://10.0.22.120:1180/limit
查看日志:
其他都是:
2023/01/10 17:30:53 [error] 215#215: *29203 limiting connections by zone "perip_conn", client: 10.0.22.112, server: localhost, request: "GET /limit HTTP/1.0", host: "10.0.22.120:1180"
同一个连接1秒同时只能请求一次
3.2. 每个ip限制6个连接但是1个并发客户端(每个请求0.5s)
nginx配置:
ab测试:
1个连接1秒内发起10000次测试
sudo ab -n 10000 -c 1 -t 10 http://10.0.22.120:1180/limit
查看日志:
可以发现每次请求间隔都是0.5秒,也就是同时只有一个客户端可以请求
3.3. 每个server限制6个连接10个并发客户端(每个请求1s)
nginx配置:
ab测试:
10个连接10000次测试持续20秒
sudo ab -n 10000 -c 10 -t 20 http://10.0.22.120:1180/limit
查看日志:
可以发现非常工整,一秒之内最多只能有6个同求同时存在,只有请求结束了才会开始新的请求。如果设置为一次请求0.5秒,那么1秒就会有达到12个左右,因为请求结束以后,其他的请求被允许的。
这是同时存在请求数的概念。