nginx 限流学习

前言

在当今流量徒增的互联网时代,很多业务场景都会涉及到高并发。这个时候接口进行限流是非常有必要的,而限流是Nginx最有用的特性之一。

一般情况下,首页的并发量很大,即使应用了多级缓存,用户不停的刷新网站也是没有必要的,甚至有些恶意的请求也会对系统造成影响。

其作用可以防止用户恶意刷爆网站,控制并发量。

nginx 主要实现限流的两个模块:

  • 控制速率
  • 控制并发量

控制速率

limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s;
  • $binary_remote_addr — 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。简单的来看这就是固定写法
  • zone=myRateLimit:10m — 表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息。相当于定义空间
  • rate=2r/s — 表示允许相同标识的客户端的访问频次,这里限制的是每秒2次,还可以有比如30r/m的。

使用:

  location / {
            #限流
            limit_req zone=myRateLimit;
            root   html;
            index  index.html index.htm;
        }

limit_req 还有其他参数,可以使得限流模块优化

处理流量突刺(Bursts)

对于他的理解就是,bursts定义了一个队列,这个队列有数量限制,=5,就是在当第一个请求被处理是,接下里的控制时间(速率定义)内的5个请求可以被存储在队列中,如果超过这个队列就会返回503

无延迟排队(nodelay)

带有burst的配置产生平滑的网络流量,但是不实用,因为该配置会使得你的网站表现的很慢。因为在控制时间内(很短)等待的其他请求,可能已经失去了他的意义,不需要再去响应他。而nodelay就是为了解决这个存在

所以Bursts一般都是与nodelay一起使用

下面是优化写法

  location / {
            limit_req zone=myRateLimit burst=5 nodelay;
            root   html;
            index  index.html index.htm;
        }
  • zone=one 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。
  • burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
  • nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队。

控制并发量(imit_conn_zone)

用来限制同一时间连接数,即并发限制。这与上面的每秒连接次数不同,这个主要针对并发处理。即,当有定的用户并发请求时,我们可以控制并发个数,拒绝不合理并发量请求

    # 根据IP进行限流
    # limit_conn_zone $binary_remote_addr zone=addr:1m;

    #存储个人请求IP的限流容量
    # limit_conn_zone $binary_remote_addr zone=perip:10m;
    #整个location对应的请求的并发量配置
    # limit_conn_zone $server_name zone=perserver:10m;

实现

 location /brand{
           #limit_conn addr 5;
           #limit_conn perip 3;
           #limit_conn persrver 10;
           proxy_pass http://192.168.0.104:8081;
        }

猜你喜欢

转载自blog.csdn.net/weixin_43157543/article/details/104806042