Nginx限流和黑名单配置


Posted in Servers onMay 20, 2022

1 背景介绍

为了防止一些抢票助手所发起的一些无用请求,我们可以使用 nginx 中的限流策略进行限流操作。
常见的限流算法:计数器、漏桶算法、令牌桶算法

Nginx限流和黑名单配置

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

2 Nginx 的限流策略

Nginx 的限流主要是两种方式: 限制访问频率限制并发连接数
Nginx 按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。

Nginx 官方版本限制 IP 的连接和并发分别有两个模块:
1、limit_req_zone:用来限制单位时间内的请求数,即速率限制 , 采用的漏桶算法 “leaky bucket”。
2、limit_conn_zone:用来限制同一时间连接数,即并发限制。

2.1 limit_req_zone限制访问频率

使用语法:limit_req_zone key zone rate
key :定义限流对象,binary_remote_addr 是一种 key,表示基于 remote_addr(客户端 IP) 来做限流,binary_ 的目的是压缩内存占用量。
zone:定义共享内存区来存储访问信息, myRateLimit:10m 表示一个大小为 10M,名字为 myRateLimit 的内存区域。1M 能存储 16000 IP 地址的
访问信息,10M 可以存储 16W IP 地址访问信息。
rate: 用于设置最大访问速率,rate=10r/s 表示每秒最多处理 10 个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每 100 毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续 100 毫秒内又有请求到达,将拒绝处理该请求。

举例:

http {
# 定义限流策略
limit_req_zone $binary_remote_addr zone=rateLimit:10m rate=1r/s ;
# 搜索服务的虚拟主机
server {
location / {
# 使用限流策略,burst=5,重点说明一下这个配置,burst 爆发的意思,这个配置的意思是设置一个大小为 5 的缓冲区(队列)当有大量请求(爆发)过来时,

# 超过了访问频次限制的请求可以先放到这个缓冲区内。nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回 503,如果没有设置,则所

# 有请求会等待排队。
limit_req zone=rateLimit burst=5 nodelay;
proxy_pass http://train-manager-search ;
   }
  }
}

频繁访问:

Nginx限流和黑名单配置

2.2 limit_conn_zone限制最大连接数

使用语法:limit_conn_zone key zone
key :定义限流对象,binary_remote_addr 是一种 key,表示基于 remote_addr(客户端 IP) 来做限流,binary_ 的目的是压缩内存占用量。
zone:定义共享内存区来存储访问信息, myRateLimit:10m 表示一个大小为 10M,名字为 myRateLimit 的内存区域。1M 能存储 16000 IP 地址的
访问信息,10M 可以存储 16W IP 地址访问信息。
举例:

http {
# 定义限流策略
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
# 搜索服务的虚拟主机
server {
location / {
# 对应的 key 是 $binary_remote_addr,表示限制单个 IP 同时最多能持有 1 个连接。
limit_conn perip 1;
# 对应的 key 是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数。注意,只有当 request header 被
后端 server 处理后,这个连接才进行计数。
limit_conn perserver 10 ;
proxy_pass http://train-manager-search ;
    }
  }
}

3 黑名单设置

有时候会有一些恶意IP攻击服务器,会基于程序频繁发起请求对服务器造成巨大压力,我们此时可以使用Nginx的黑名单功能实现黑名单过滤操作。我们首先需要配置黑名单IP,黑名单IP我们可以记录到一个配置文件中,比如配置到blockip.conf文件中:

配置固定IP为黑名单:

deny 192.168.100.1;

nginx.conf中引入blockip.conf,可以放到http, server, location语句块,配置如下:

#黑名单
include blockip.conf;

此时在192.168.100.1的IP上访问服务器,会报如下错误:

Nginx限流和黑名单配置

屏蔽ip的配置文件既可以屏蔽单个ip,也可以屏蔽ip段,或者只允许某个ip或者某个ip段访问。

# 屏蔽单个ip访问
deny IP;
# 允许单个ip访问
allow IP;
# 屏蔽所有ip访问
deny all;
# 允许所有ip访问
allow all;
#屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令
deny 123.0.0.0/8
#屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令
deny 124.45.0.0/16
#屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令
deny 123.45.6.0/24
1234567891011121314

如果你想实现这样的应用,除了几个IP外,其他全部拒绝,那需要你在blockip.conf中这样写:

allow 192.168.100.1;
allow 192.168.100.2;
deny all;
123

但是这种手动配置的方式可能太过繁琐,我们也可以配置动态黑白名单。

配置动态黑白名单,我们可以采用Lua+Redis实现,将黑名单存入到Redis缓存,每次执行请求时,通过lua脚本先获取用户IP,匹配IP是否属于黑名单,如果是,则不让请求,如果不是,则放行。

到此这篇关于Nginx限流和黑名单配置的文章就介绍到这了!


Tags in this post...

Servers 相关文章推荐
nginx 设置多个站跨域
Mar 09 Servers
Nginx配置并兼容HTTP实现代码解析
Mar 31 Servers
详解Nginx启动失败的几种错误处理
Apr 01 Servers
nginx中proxy_pass各种用法详解
Nov 07 Servers
解决IIS7下无法绑定https主机的问题
Apr 29 Servers
ubuntu下常用apt命令介绍
Jun 05 Servers
V Rising 服务器搭建图文教程
Jun 16 Servers
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
Jun 25 Servers
在windows server 2012 r2中安装mysql的详细步骤
Jul 23 Servers
WIN10使用IIS部署ftp服务器详细教程
Aug 05 Servers
CentOS7设置ssh服务以及端口修改方式
Dec 24 Servers
码云(gitee)通过git自动同步到阿里云服务器
Dec 24 Servers
Nginx利用Logrotate实现日志分割
May 20 #Servers
nginx lua 操作 mysql
May 15 #Servers
Nginx HTTP跳转至HTTPS
Nginx 匹配方式
May 15 #Servers
nginx实现多geoserver服务的负载均衡
May 15 #Servers
Nginx 常用配置
鲲鹏 CentOS 7 安装Python3.7
May 11 #Servers
You might like
一个SQL管理员的web接口
2006/10/09 PHP
推荐5款跨平台的PHP编辑器
2014/12/25 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
2013/11/21 Javascript
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
2016/10/04 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
angular 实现下拉列表组件的示例代码
2019/03/09 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
Python实现简单http服务器
2018/04/12 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
2019/05/31 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
消防隐患整改通知书
2015/04/22 职场文书
2015年老干部工作总结
2015/04/23 职场文书
2015年司法所工作总结
2015/04/27 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书
golang为什么要统一错误处理
2022/04/03 Golang