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配置proxy_pass中url末尾带/与不带/的区别详解
Mar 31 Servers
Linux安装apache服务器的配置过程
Nov 27 Servers
Nginx图片服务器配置之后图片访问404的问题解决
Mar 21 Servers
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
Apr 02 Servers
Consul在linux环境的集群部署
Apr 08 Servers
nginx配置之并发频次限制
Apr 18 Servers
阿里云 Windows server 2019 配置FTP
Apr 28 Servers
Nginx 匹配方式
May 15 Servers
Nginx本地配置SSL访问的实例教程
May 30 Servers
Nginx配置使用详解
Jul 07 Servers
nginx配置指令之server_name的具体使用
Aug 14 Servers
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
Sep 23 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
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
JQuery的一些小应用收集
2010/03/27 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
Angular4表单验证代码详解
2017/09/03 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
使用Node搭建reactSSR服务端渲染架构
2018/08/30 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
敏捷开发的主要原则都有哪些
2015/04/26 面试题
单位消防安全制度
2014/01/12 职场文书
运动会致辞稿50字
2014/02/04 职场文书
2014年妇幼保健工作总结
2014/12/08 职场文书
2015年外联部工作总结
2015/04/03 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python