微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

nginx限流 限ip 令牌桶算法

Nginx限流 限ip 令牌桶算法

语法: limit_req zone=name [burst=number] [nodelay]; 

语法: limit_req_zone $variable zone=name:size rate=rate; $variable:

变量 zone:代表当前限制的名称与存放大小 

name:名称 

size:存放客户端信息的大小 

rate:表示速率 

认值: none 

上下文: http

Zone=one 表示设置了名为"one",大小为10兆字节,也可以理解为设置的限流名为one rate=10r/s 的意思是允许1秒钟不超过10个请求

使用$binary_remote_addr【这是一个二进制的信息记录 $remote_addr(非二进制的)】(Nginx本身存在的,保存客户端的ip地址)变量,可以将每条状态记录的 大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录。

如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。 

速度可以设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,所以如果你需要指定每秒处理少于1个的请求,2秒处理一个请求,可以使用 "30r/m"。

http{
	limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
	server{
		location  /search/ {
			limit_req zone=one burst=5;
		}
	}
}

image.png

2. ngx_http_limit_conn_module

限制请求连接数 https://tengine.taobao.org/Nginx_docs/cn/docs/http/ngx_http_limit_conn_module.html

# 对ip的请求次数限制
http下
limit_conn_zone $binary_remote_addr zone=addr:10m;
server下
# 同一IP同一时间只允许有一个连接
limit_conn addr 1;

3.PHP漏桶算法

class LeakyDemo{
    private  $timeStamp;
    public  $capacity;// 桶的容量
    public  $rate; // 水漏出的速度
    public  $water;// 当前水量(当前累积请求数)

    public function __construct()
    {
        $this->timeStamp = time();
    }
    public  function grant(){
        $Now=time();
        $this->water=max(0,$this->water-($Now-$this->timeStamp)*$this->rate);// 先执行漏水,计算剩余水量
        $this->timeStamp=$Now;
        if(($this->water+1)<$this->capacity){
            // 尝试加水,并且水还未满
            $this->water+=1;
            return true;
        }else{
            // 水满,拒绝加水
            return false;
        }
    }

}

4.令牌桶

5.现在下载速度

autoindex on;#开启目录模式正式课不加
root /redis_2004;#下载目录
limit_rate 10k;#现在下载每秒10k


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐