首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Nginx神器、访问高峰限流配置

Nginx神器、访问高峰限流配置

作者头像
Linux运维技术之路
发布2022-06-07 09:32:19
发布2022-06-07 09:32:19
1.4K0
举报

一、客户需求

需求1:客户需要对某个特定对接口url请求,进行限流访问。(比如超过1r/s )

  • 特点:限流对关键特征,不是根据Ip地址,而是针对所有用户请求(同一时间内,可能有NAT 上网对客户,会导致限流误杀行为)。

需求2: 限流成功后,返回指定页面,此处客户需要返回json格式

二、解决方案:

代码语言:javascript
复制
关键知识点:
高并发系统有三把利器用来保护系统:缓存、降级和限流
限流算法:计数器 、漏桶算法、令牌桶算法

1、 限流算法

限流算法主要有(令牌桶算法、漏桶算法)

1-1、令牌桶算法

算法思想是:

  • 令牌以固定速率产生,并缓存到令牌桶中;
  • 令牌桶放满时,多余的令牌被丢弃;
  • 请求要消耗等比例的令牌才能被处理;
  • 令牌不够时,请求被缓存

1-2、漏桶算法

算法思想是:

  • 水(请求)从上方倒入水桶,从水桶下方流出(被处理);
  • 来不及流出的水存在水桶中(缓冲),以固定速率流出;
  • 水桶满后水溢出(丢弃)。
  • 这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃。 相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的。

从作用上来说,漏桶和令牌桶算法最明显的区别就是是否允许突发流量(burst)的处理,漏桶算法能够强行限制数据的实时传输(处理)速率,对突发流量不做额外处理;而令牌桶算法能够在限制数据的平均传输速率的同时允许某种程度的突发传输。

Nginx按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。

2、利用nginx限速模块limit_req_zone

  • limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket"
  • limit_req_conn 用来限制同一时间连接数,即并发限制

3、配置方案

3.1针对IP地址

代码语言:javascript
复制
http{
...
limit_req_zone $binary_remote_addr zone=one:30m rate=1r/s;
#    limit_req_zone $binary_remote_addr $uri zone=two:30m rate=30r/s;
#    limit_req_zone $binary_remote_addr $request_uri zone=three:30m rate=10r/s;
...
    server {
    ...
        location /demo
            {
            index index.php index.html;
            limit_req zone=one burst=4 nodelay;
            limit_req_status 597;  ##指定json格式
            limit_req_status 598;  ##指定html
        }
        error_page   598  /598.html; ##  html格式
            location = /598.html {
                root   html;
            }
        error_page 597 /597; ##json格式
        location = /597 {
                default_type application/json;
                add_header Content-Type 'text/html; charset=utf-8';
                return 200 '{"code":"200", "data": {111111111},"msg":"访问高峰期..."}';
        }
    }
}

3.2针对url请求的

代码语言:javascript
复制
http{
...
# limit_req_zone $binary_remote_addr zone=one:30m rate=1r/s;
# limit_req_zone $binary_remote_addr $uri zone=two:30m rate=30r/s;
# limit_req_zone $binary_remote_addr $request_uri zone=three:30m rate=10r/s;
limit_req_zone $request_uri zone=demo:30m rate=1r/s;
...
    server{
    ...
        location /demo
            {
            index index.php index.html;
            limit_req zone=demo burst=4 nodelay;
            limit_req_status 597;  ##指定json格式
            limit_req_status 598;  ##指定html
        }
        error_page   598  /598.html; ##  html格式
            location = /598.html {
                root   html;
            }
        error_page 597 /597; ##json格式
        location = /597 {
                default_type application/json;
                add_header Content-Type 'text/html; charset=utf-8';
                return 200 '{"code":"200", "data": {111111111},"msg":"访问高峰期..."}';
        }
    }
}
  • 备注:加上 nodelay之后超过 burst大小的请求就会直接返回503,如果没有该字段会造成大量的tcp连接请求等待。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linux运维技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、客户需求
    • 需求1:客户需要对某个特定对接口url请求,进行限流访问。(比如超过1r/s )
    • 需求2: 限流成功后,返回指定页面,此处客户需要返回json格式
  • 二、解决方案:
    • 1、 限流算法
    • 2、利用nginx限速模块limit_req_zone
    • 3、配置方案
      • 3.1针对IP地址
      • 3.2针对url请求的
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档