nginx网站限速限流配置——网站被频繁攻击,nginx上的设置limit_req和limit_conn
利用ngx_http_limit_req_module模块,可根据键值(如ip)限制每分钟的速率;
- limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket" , http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
- limit_req_conn 用来限制同一时间连接数,即并发限制 http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
其实看官方的稳定比看百度查到的稳定,配置起来更明了。但是,官方给的说明,这里还是百度看到一些文章,摘录一些,做些笔记,
关于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的更多相关文章
- 用nginx实现分布式限流
1.前言 一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流 . 本文主要阐述如何用nginx 来实现限流. 听说 Hystrix 也可 ...
- 图解Nginx限流配置
本文以示例的形式,由浅入深讲解Nginx限流相关配置,是对简略的官方文档的积极补充. Nginx限流使用的是leaky bucket算法,如对算法感兴趣,可移步维基百科先行阅读.不过不了解此算法,不影 ...
- 限流(四)nginx接入层限流
一.nginx限流模块 接入层指的是请求流量的入口,我们可以在这里做很多控制,比如:负载均衡,缓存,限流等. nginx中针对限流有两个模块可以处理: 1)ngx_http_limit_req_mod ...
- nginx限流模块(防范DDOS攻击)
Nginx限流模式(防范DDOS攻击) nginx中俩个限流模块: 1.ngx_http_limit_req_module(按请求速率限流) 2.ngx_http_limit_conn_module( ...
- 简易RPC框架-客户端限流配置
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。
Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛. 用Nginx+Lua(OpenResty)开发高性能Web ...
- Nginx限流配置
电商平台营销时候,经常会碰到的大流量问题,除了做流量分流处理,可能还要做用户黑白名单.信誉分析,进而根据用户ip信誉权重做相应的流量拦截.限制流量.Nginx自身有的请求限制模块ngx_http_li ...
- 死磕nginx系列--nginx 限流配置
限流算法 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中: 令牌桶放满时,多余的令牌被丢弃: 请求要消耗等比例的令牌才能被处理: 令牌不够时,请求被缓存. 漏桶算法 算法思想是: 水( ...
- [转]Nginx限流配置
原文:https://www.cnblogs.com/biglittleant/p/8979915.html 作者:biglittleant 1. 限流算法 1.1 令牌桶算法 算法思想是: 令牌以固 ...
- nginx之 nginx限流配置
limit_req zone=req_zone;严格依照在limti_req_zone中配置的rate来处理请求超过rate处理能力范围的,直接drop表现为对收到的请求无延时limit_req zo ...
随机推荐
- 装箱问题(lgP1049)
01背包问题. 与模板不同,这道题要求的是最小剩余空间,也就是求背包里最多能放多少东西. 所以状态转移方程变为 fi= fi - w[i] + wi . 其中 fi 表示当背包容量为 i 时可放的最大 ...
- JUC并发编程学习笔记(四)8锁现象
8锁现象 八锁->就是关于锁的八个问题 锁是什么,如何判断锁的是谁 对象.class模板 深刻理解锁 锁的东西无外乎就两样:1.同步方法的调用者,2.Class模板. 同一个锁中,只有当前线程资 ...
- Java 中 field 和 variable 区别及相关术语解释(转)
https://www.jianshu.com/p/08e2d85d3ce9 这是一个以前从没仔细想过的问题--最近在阅读Java Puzzlers,发现其大量使用了"域"这个词, ...
- 使用DocumentBuilderFactory解析XML浅谈
背景: 当使用Java解析XML时,可以使用javax.xml.parsers.DocumentBuilderFactory类.这个类提供了一种创建解析XML的文档对象的方式.DocumentBuil ...
- 阿里云oss视频上传及预览图汇总
阿里云OSS视频上传的几种方式 1.Web端直传实践简介 https://help.aliyun.com/document_detail/31923.html?spm=a2c4g.11186623.6 ...
- Why Microservices ?
微服务(Microservices)是一种软件架构设计风格,其中应用程序由一组小型.独立.自治的服务组成,这些服务共同工作以构建整体应用.每个服务都专注于一个特定的业务功能,可以独立部署.扩展和维护. ...
- 一道入门的java安全题
[XCTF]Zhuanxv 收获 java题的一般流程 HQL注入 SQL注入 看题 目录扫描 dirsearch扫目录,发现list目录: 一个登录界面,本着尽量不写sql注入题目的原则(因为太菜了 ...
- C++ Qt开发:使用关联容器类
当我们谈论编程中的数据结构时,顺序容器是不可忽视的一个重要概念.顺序容器是一种能够按照元素添加的顺序来存储和检索数据的数据结构.它们提供了简单而直观的方式来组织和管理数据,为程序员提供了灵活性和性能的 ...
- JavaScript 生产者消费者模型
因为node使用单线程的方式实现,所以,在此使用定时器timer取代线程thread来实现生产者消费者模型. 1 var sigintCount = 0; 2 var productArray = [ ...
- 华企盾DSC导致Solidworks无法导出xls文件
将Solidworks进程和Excel进程的OLE控制和启用虚拟重定向都关闭