PHP

首页 -  PHP  -  nginx限流 限ip 令牌桶算法

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


(0)
分享:

本文由:xiaoshu168.com 作者:xiaoshu发表,转载请注明来源!

标签:

相关阅读