利用ngx_http_limit_req_module模块,可根据键值(如ip)限制每分钟的速率;

其实看官方的稳定比看百度查到的稳定,配置起来更明了。但是,官方给的说明,这里还是百度看到一些文章,摘录一些,做些笔记,

关于limit_req和limit_conn的区别

what is the difference  between connection and request? 

  • connection是连接,即常说的tcp连接,通过三次握手而建立的一个完整状态机。建立一个连接,必须得要三次握手。
  • request是指请求,即http请求,tcp连接是有状态的,而构建在tcp之上的http却是无状态的协议

通过打开一个网页,然后通过wareshark可以看到,一个连接建立后(即三次握手后),在这个连接断开之前(即四次挥手之前),会有很多的http request,这就是他们的区别:即一个连接的生命周期中,会存在一个或者多个请求,这是为了加快效率,避免每次请求都要三次握手建立连接,现在的HTTP/1.1协议都支持这种特性,叫做keepalive。

limit_conn_zone $binanry_remote_addr zone=conn_zone:1m;

limit_conn conn_zone 1;

这样的配配置,表明以ip为key,来限制每个ip访问lmit.html文件时候,最多只能有一个在线,否则其余的都要返回不可用。

这种情况就是一个静止状态的计数可以实现,而无关乎多长时间。

举个例子,如果你的这个连接一直不释放,即使你通过这一个连接发送出再多的request请求,只要我能够应付,那么我就帮你处理

但是,如果你只需要处理2个请求,但是这两个请求是分别用两个连接同时发送过来的,那么,我就只能处理其中一个,另外一个就不行。这就是他的区别。

limit_req_zone $binary_remtoe_addr zone=req_zone:1m rate=1r/s; #这里需要为共享内存配置一个速率rate,

limit_conn zone=req_zone;

表明:对于每个ip来说,处理请求的速度不超过每秒1个请求

可以看到这是个速度量(而上面的那个是数字量,速度和个数还是有直观的区别的吧。。)

是同时发送出100个请求(不管是通过100个连接还是1个连接),只要你请求到底的速度超过每秒1个,那么我就会拒绝你。

对于与 burst,推荐阅读:Nginx下limit_req模块burst参数超详细解析 https://blog.csdn.net/hellow__world/article/details/78658041

这里把其总结摘录如下:

limit_req zone=req_zone;

严格依照在limti_req_zone中配置的rate来处理请求
超过rate处理能力范围的,直接drop
表现为对收到的请求无延时

limit_req zone=req_zone burst=5;

依照在limti_req_zone中配置的rate来处理请求
同时设置了一个大小为5的缓冲队列,在缓冲队列中的请求会等待慢慢处理
超过了burst缓冲队列长度和rate处理能力的请求被直接丢弃
表现为对收到的请求有延时

limit_req zone=req_zone burst=5 nodelay;

依照在limti_req_zone中配置的rate来处理请求
同时设置了一个大小为5的缓冲队列,当请求到来时,会爆发出一个峰值处理能力,对于峰值处理数量之外的请求,直接丢弃
在完成峰值请求之后,缓冲队列不能再放入请求。如果rate=10r/m,且这段时间内没有请求再到来,则每6 s 缓冲队列就能回复一个缓冲请求的能力,直到回复到能缓冲5个请求位置。

小伙伴对这个zone估计还是有一些疑问,有疑问可以在下面评论,大家一起讨论,比如,有人可能会问,一个客服端占用5个,那么327680只能容纳65536个客服端,那么第65537个客服端就会返回503错误

limit_conn_zone

语法:

Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
看上面的语法,limit_conn_zone只能用在http段,例如:

http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
server_name www.tomener.com tomener.com;
location / {
root /var/www/tomener;
index index.php index.html index.htm;
limit_conn addr 5; #是限制每个IP只能发起5个连接
limit_rate 100k; #限速为 100KB/秒
}
}
}

对于关系:
key => $binary_remote_addr #二进制的IP地址
name => addr #随便取的一个名字,比如,你可以取成abc
size => 10m #空间大小,这里是10兆
一个二进制的ip地址在32位机器上占用32个字节,在64位机器上占用63个字节,那么10M可以存放多少呢,计算一下,10x1024x1024/32 = 327680,意思就是可以存放326780个ip地址(32位),64位可以存放163840个ip

1、key:键,可以说是一个规则,就是对客户端连接的一个标识,比如上面用的是IP地址,比如我们可以用$query_string,例如:/index.php?mp=138944093953,那我们就可以根据mp的值来限制连接数,更多的nginx内置变量请查看http://nginx.org/en/docs/varindex.html

2、zone:共享内存空间,作用:保存每个key对应的连接数

3、size:共享内存空间大小,如1M、10M、100K
当共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误

limit_conn_log_level指令

Syntax: limit_conn_log_level info | notice | warn | error;
Default: limit_conn_log_level error;
Context: http, server, location
说明:当达到最大限制连接数后,记录日志的等级。

limit_conn_status指令

Syntax: limit_conn_status code;
Default: limit_conn_status 503;
Context: http, server, location
说明:当超过限制后,返回的响应状态码,默认是503,现在你就知道上面为什么会返回503(Service Temporarily Unavailable)服务暂时不可用

例子:

1、同时限制ip和虚拟主机最大并发连接

http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
location / {
limit_conn perip 10;
limit_conn perserver 1000;
}
}
}

根据官方给出的:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

具体配置如下

http {
    ########################### 限速配置 ################################
limit_conn_log_level error;
limit_conn_status 503;
#limit_conn_zone $binary_remote_addr zone=one:1m;
#limit_conn_zone $server_name zone=perserver:1m;
# 定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
# 以$binary_remote_addr 为key,限制平均每秒的请求为20个,
# 1M能存储16000个状态,rete的值必须为整数,
# 如果限制两秒钟一个请求,可以设置成30r/m ,其中$binary_remote_addr有时需要根据自己已有的log_format变量配置进行替换
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

#limit_req zone=perip burst=10;
# 限制客户端并发连接数量为20, allow only one connection per an IP address at a time(每次). ;
#是限制每个IP只能发起20连接 (addr 要跟 limit_conn_zone 的变量对应)
limit_conn perip 15;
limit_conn perserver 15;
   ############################ web server #######################
include /etc/nginx/http/http_web.conf;

}

参考文章:

Nginx限制访问速率和最大并发连接数模块--limit (防范DDOS攻击)  https://www.cnblogs.com/wjoyxt/p/6128183.html

nginx网站限速限流配置——网站被频繁攻击,nginx上的设置limit_req和limit_conn的更多相关文章

  1. 用nginx实现分布式限流

    1.前言 一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流 . 本文主要阐述如何用nginx 来实现限流. 听说 Hystrix 也可 ...

  2. 图解Nginx限流配置

    本文以示例的形式,由浅入深讲解Nginx限流相关配置,是对简略的官方文档的积极补充. Nginx限流使用的是leaky bucket算法,如对算法感兴趣,可移步维基百科先行阅读.不过不了解此算法,不影 ...

  3. 限流(四)nginx接入层限流

    一.nginx限流模块 接入层指的是请求流量的入口,我们可以在这里做很多控制,比如:负载均衡,缓存,限流等. nginx中针对限流有两个模块可以处理: 1)ngx_http_limit_req_mod ...

  4. nginx限流模块(防范DDOS攻击)

    Nginx限流模式(防范DDOS攻击) nginx中俩个限流模块: 1.ngx_http_limit_req_module(按请求速率限流) 2.ngx_http_limit_conn_module( ...

  5. 简易RPC框架-客户端限流配置

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  6. Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。

    Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛. 用Nginx+Lua(OpenResty)开发高性能Web ...

  7. Nginx限流配置

    电商平台营销时候,经常会碰到的大流量问题,除了做流量分流处理,可能还要做用户黑白名单.信誉分析,进而根据用户ip信誉权重做相应的流量拦截.限制流量.Nginx自身有的请求限制模块ngx_http_li ...

  8. 死磕nginx系列--nginx 限流配置

    限流算法 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中: 令牌桶放满时,多余的令牌被丢弃: 请求要消耗等比例的令牌才能被处理: 令牌不够时,请求被缓存. 漏桶算法 算法思想是: 水( ...

  9. [转]Nginx限流配置

    原文:https://www.cnblogs.com/biglittleant/p/8979915.html 作者:biglittleant 1. 限流算法 1.1 令牌桶算法 算法思想是: 令牌以固 ...

  10. nginx之 nginx限流配置

    limit_req zone=req_zone;严格依照在limti_req_zone中配置的rate来处理请求超过rate处理能力范围的,直接drop表现为对收到的请求无延时limit_req zo ...

随机推荐

  1. sql删除进程

    使用一下语句杀掉进程 USE master go DECLARE @dbname VARCHAR(200) SET @dbname = 'xxxx' --要关闭进程的数据库名 DECLARE @sql ...

  2. Util应用框架基础(二) - 对象到对象映射(AutoMapper)

    本节介绍Util应用框架相似对象之间的转换方法. 文章分为多个小节,如果对设计原理不感兴趣,只需阅读基础用法部分即可. 概述 现代化分层架构,普遍采用了构造块DTO(数据传输对象). DTO是一种参数 ...

  3. [Flink] Flink(CDC/SQL)Job在启动时,报“ConnectException: Error reading MySQL variables: Access denied for user 'xxxx '@'xxxx' (using password: YES)”(1个空格引发的"乌龙")

    1 问题描述 1.1 基本信息 所属环境:CN-PT 问题时间:2023-11-21 所属程序: Flink Job(XXXPT_dimDeviceLogEventRi) 作业类型: Flink SQ ...

  4. FC 交换机基础配置

    目录 Primera600 存储服务器 FC 交换机 交换机信息查看 交换机配置管理 用户管理 以太网配置 端口配置管理 别名配置 证书管理 角色管理 Zone 管理 参考网址 Primera600 ...

  5. 关于Maven执行mvn help:system命令报错

    报错: [ERROR] Error executing Maven.[ERROR] 2 problems were encountered while building the effective s ...

  6. vue的响应式原理:依赖追踪

    在明白原理之前,我们有很多表面现象.使用场景需要记忆.明白了原理后,你会发现它们已经不需要记了,因为从原理出发,你自己都能把它们推导出来,一切是那么的自然而然.感觉就是:这还用记吗?很明显嘛! 之前我 ...

  7. lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O

    -- create a class Animal={name = "no_name" , age=0 } function Animal:bark(voice) print(sel ...

  8. JDK动态代理~Cglib动态代理,进行方法的增强

    JDK动态代理(必须要有接口,代理类和被代理类实现相同的接口) public class UserServiceJDKProxy { public static UserService createU ...

  9. .net 温故知新【16】:Asp.Net Core WebAPI 筛选器

    一.筛选器 通过使用筛选器可在请求处理管道中的特定阶段之前或之后运行代码. 这即是我们经常听到的面向切面编程AOP(Aspect Oriented Programming)技术,AOP通过预编译方式和 ...

  10. 【C#】【字符串内插】关于$" "(字符串内插构造格式化字符串)的使用

    1.变量名插入使用 var num = 1; Console.WriteLine($"Output number:{num}"); // Output: Output number ...