限流(四)nginx接入层限流

一、nginx限流模块

接入层指的是请求流量的入口,我们可以在这里做很多控制,比如:负载均衡,缓存,限流等。

nginx中针对限流有两个模块可以处理:

1)ngx_http_limit_req_module;连接数限流模块

2)ngx_http_limit_conn_module;请求限流模块

连接数限流模块是基于计数器方式实现的,请求限流模块是基于漏桶算法实现的;

关于限流算法可以参考:https://www.cnblogs.com/lay2017/p/9060497.html

除了以上两种,我们曾在分布式限流中提到nginx+lua方式来实现限流操作,只要集成一下lua模块。或者采用openresty,它自带了lua模块,可以实现复杂的限流场景。

本文不涉及lua模块的部分,只是简单使用nginx默认自带的两个模块来实现限流操作。

二、ngx_http_limit_conn_module

连接数限流模块,和一般的计数器限流是一样的思路,通过一个key来存取对应的value,value表示请求的数量。比如:限制某个IP的总请求数量,那么我们只需要改变和存取该IP对应的请求数量即可。

ngx_http_limit_conn_module限流模块使用代码如下:

http{
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    limit_conn_log_level error;
    limit_conn_status 503;
    ...
    server{
        ...
        location /limit{
            limit_conn addr 1;
            proxy_pass ‘http:www.baidu.com‘;
        }
    }
}

以上代码:

1)limit_conn:配置的是要存放KEY和计数器的共享内存区域(addr),并指定KEY的最大连接树木(这里是1)

2) limit_conn_zone: 配置限流的KEY(这里是IP地址:$binary_remote_addr)、共享内存区域的大小(10m)。

3) limit_conn_status: 配置限流以后返回的状态码;

4)limit_conn_log_level: 配置限流以后的日志级别;

5)proxy_pass: 返回代理的是百度的页面;

我们通过测试工具测试1秒钟20个请求的结果: http://localhost/limit

输出结果:

有部分请求将被限流并返回结果503,而未被限流的则返回百度页面;

三、ngx_http_limit_req_module

请求限流模块实现的是漏桶算法,主要是对请求的速率进行限制。

直接看具体代码:

http {
    limit_req_zone $binary_remote_addr zone=addr:10m rate=1r/s;
    limit_conn_log_level error;
    limit_conn_status 503;
    ...
    server {
    ...
        location /limit {
            limit_req zone=addr burst=2 nodelay;
            proxy_pass: ‘http://www.baidu.com‘;
        }
    }
}

1)limit_req:配置共享内存区域、桶容量(突发容量,默认0)、是否延迟模式(默认延迟);

2)limit_req_zone:配置限流KEY、及存放KEY对应信息的共享内存区域大小、固定请求速率;此处指定的KEY是“$binary_remote_addr”表示IP地址;固定请求速率使用rate参数配置,支持10r/s和60r/m,即每秒10个请求和每分钟60个请求,不过最终都会转换为每秒的固定请求速率(10r/s为每100毫秒处理一个请求;60r/m,即每1000毫秒处理一个请求)。

3)limit_conn_status:配置被限流后返回的状态码,默认返回503;

4)limit_conn_log_level:配置记录被限流后的日志级别,默认error级别。

limit_req的主要执行过程如下所示:

1、请求进入后首先判断最后一次请求时间相对于当前时间(第一次是0)是否需要限流,如果需要限流则执行步骤2,否则执行步骤3;

2.1、如果没有配置桶容量(burst),则桶容量为0;按照固定速率处理请求;如果请求被限流,则直接返回相应的错误码(默认503);

2.2、如果配置了桶容量(burst>0)且延迟模式(没有配置nodelay);如果桶满了,则新进入的请求被限流;如果没有满则请求会以固定平均速率被处理(按照固定速率并根据需要延迟处理请求,延迟使用休眠实现);

2.3、如果配置了桶容量(burst>0)且非延迟模式(配置了nodelay);不会按照固定速率处理请求,而是允许突发处理请求;如果桶满了,则请求被限流,直接返回相应的错误码;

3、如果没有被限流,则正常处理请求;

4、Nginx会在相应时机进行选择一些(3个节点)限流KEY进行过期处理,进行内存回收。

测试工具测试结果:

配置zone\burst\nodelay的情况下,20r/1s测试结果为3个,理论上应该是2个成功,但是由于计算算法问题,首次会出现3个,不过可以忽略不计。其它则返回503错误

参考文章:

http://jinnianshilongnian.iteye.com/blog/2305117

原文地址:https://www.cnblogs.com/lay2017/p/9114475.html

时间: 2024-08-10 13:27:19

限流(四)nginx接入层限流的相关文章

JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化. ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的

用nginx实现分布式限流(防DDOS攻击)

1.前言 一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流 . 本文主要阐述如何用nginx 来实现限流. 听说 Hystrix 也可以, 各位有兴趣可以去研究哈 . 2. 首先部署一个对外暴露接口的程序 我这里部署的是一个spring boot 项目 里面暴露了如下接口, 很简单 package com.anuo.app.controller; import org.slf4j.Logger; import org.slf4j.

NGINX上的限流

本文是对 https://www.nginx.com/blog/rate-limiting-nginx/ 的主要内容(去掉了关于NGINX Plus相关内容)的翻译 限流(rate limiting)是NGINX众多特性中最有用的,也是经常容易被误解和错误配置的,特性之一.该特性可以限制某个用户在一个给定时间段内能够产生的HTTP请求数.请求可以简单到就是一个对于主页的GET请求或者一个登陆表格的POST请求. 限流也可以用于安全目的上,比如减慢暴力密码破解攻击.通过限制进来的请求速率,并且(结

Java成长第四集--文本处理IO流

Java IO流在实际业务中使用的频率还是蛮高的,一些业务场景比如,文件的上传和导出,文件的读取等基本都是通过操作IO流来实现的,所以IO流是我们现在学习过程中必须要掌握的技能之一,熟练的使用IO流,理解它的操作过程,能够让我们在今后的开发过程中达到事半功倍的效果.话不多说,首先,让我们来看看Java IO流的组织架构图: 所以,我们可以清晰的发现IO流中主要分为了两类,一类是字节流一类是字符流,要知道两者的区别,我们还需要理解一个概念, 流: 在程序中所有的数据都是以流的方式进行传输或保存的,

Java基础知识强化之IO流笔记63:随机访问流RandomAccessFile

1. 随机访问流RandomAccessFile RandomAccessFile类不属于流,是Object类的子类.但它融合了InputStream和OutputStream的功能.支持对随机访问文件的读取和写入. RandomAccessFile的构造方法: 构造方法摘要 RandomAccessFile(File file, String mode)           创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定. RandomAccessFile(St

IO流(三):字符流及其缓冲流

一.字符流概述 (一).本质 1.字节流操作中文数据不是特别的方便,所以就出现了转换流. 转换流的作用就是把字节流转换字符流来使用. 2.转换流其实是一个字符流. 字符流 = 字节流 + 编码表 (二)编码表 1.编码表简介: ASCII ISO-8859-1 GB2312 GBK GB18030 UTF-8 (三)String中的编码 1.内容: 1)编码 String --> byte[] byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码

关于项目中的DAL数据接入层架构设计

摘要:项目中对关系型数据库的接入再寻常不过,也有海量的ORM工具可供选择,一个一般性的DAL数据接入层的结构却大同小异,这里就分享一下使用Hibernate.Spring.Hessian这三大工具对DAL层的具体实现方法,也是对之前使用的一个总结. 关键词:Hibernate, Spring, Hessian, DAL, 数据接入层, 架构设计 注意:以下配置或代码运行在Hibernate4.2.5,Spring3.2.4,Hessian4.0.37,Tomcat7.0.47环境下 一.Mode

后台开发技术(2)--接入层设计

通常把跟客户端直连的服务器称为接入服务器,一个或多个接入服务器构成的接入层.接入层有以下功能: 维护与客户端之间的网络连接,管理客户端的网络状态. 接收客户端请求,将请求转发到业务层,转发业务层发给客户端的数据. 就近接入,负载均衡,优化网络体验. 这里可以发现,如果把接入层跟业务层合并也可以实现以上的功能,而且节省了实现功能2需要的工作量,根据简单性原则,接入层不应该被独立出来.对于一个功能单一,用户少,并发小的系统,接入层的确没有必要独立出来.但对于一个复杂的系统来说,如果把也接入层和业务层

IO包中的其他类 打印流,序列流,操作对象,管道流,RandomAccessFile,操作基本数据类型,操作字节数组

打印流,序列流,操作对象,管道流,RandomAccessFile,操作基本数据类型,操作字节数组 一.打印流: 该流提供了打印方法,可以将各种数据类型的数据都原样打印. 字节打印流PrintStream构造函数可以接收的参数类型1.File对象 File2.字符串路径 String3.字节输出流 OutputStream 字符打印流PrintWriter(更常用)1.File对象 File2.字符串路径 String3.字节输出流 OutputStream4.字符输出流 Writer publ