连接数限流模块ngx_http_limit_conn_module和漏桶算法实现的请求限流模块ngx_http_limit_req_module
limit_req_zone $binary_remote_addr $uri zone=two:3m rate=1r/s;
表示当相同的ip地址并且访问相同的uri,会导致进入limit req的限制(每秒1个请求)
limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 “leaky bucket”
limit_req_conn 用来限制同一时间连接数,即并发限制
limit_req_conn模块可以根据源IP限制单用户并发访问的连接数或连接到该服务的总并发连接数
limit_req_zone $binary_remote_addr zone=req10k:30m rate=10000r/s;
当区的大小为1m的时候,大约可以记录32000个会话信息(一个会话占用 32 bytes)。
$binary_remote_addr”其表示IP地址,也可以使用如$server_name作为KEY来限制域名级别的最大连接数;
limit_conn_status:配置被限流后返回的状态码,默认返回503;
limit_conn_log_level:配置记录被限流后的日志级别,默认error级别
server{
limit_conn one 1 ,限制客户端并发连接数量为1, allow only one connection per an IP address at a time
}
lit_req_zone的功能是通过漏桶原理来限制用户的连接频率,(这个模块允许你去限制单个地址指定会话或特殊需要的请求数 )
而 limit_zone 功能是限制一个客户端的并发连接数。(这个模块可以限制单个地址的指定会话或者特殊情况的并发连接数)
按照域名限制并发连接数配置示例,接着在要限流的location中添加限流逻辑配合limit_conn使用(控制每个域名最大并发请求连接数):
limit_conn_zone $ server_name zone=perserver:10m;
如果配置了桶容量(burst>0)且延迟模式(没有配置nodelay);如果桶满了,则新进入的请求被限流;如果没有满则请求会以固定平均速率被处理(按照固定速率并根据需要延迟处理请求,延迟使用休眠实现);
如果配置了桶容量(burst>0)且非延迟模式(配置了nodelay)不会按照固定速率处理请求,而是允许突发处理请求;如果桶满了,则请求被限流,直接返回相应的错误码;
cc 攻击超过策略Qps上报日志到syslog server,离线脚本统计上报日志,保存数据库。
将qps字段+domain+当前时间作为key,会基于时间在redis产生大量的节点,时间维度分散不利于统计,且redis节点expire时间如果设置的比较小,统计不当造成遗漏。
所以统计QPS采取平均手段,根据根据domain生成redis节点,记录3分钟内cc攻击QPS。
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。