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; } } }
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
本文由:xiaoshu168.com 作者:xiaoshu发表,转载请注明来源!