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 相关文章推荐
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
Jun 21 Servers
使用nginx动态转换图片大小生成缩略图
Mar 31 Servers
Nginx代理同域名前后端分离项目的完整步骤
Mar 31 Servers
学习nginx基础知识
Sep 04 Servers
Nginx+Tomcat负载均衡集群的实现示例
Oct 24 Servers
NGINX 权限控制文件预览和下载的实现原理
Jan 18 Servers
Apache Hudi的多版本清理服务彻底讲解
Mar 31 Servers
iSCSI服务器CHAP双向认证配置
Apr 01 Servers
Vscode中SSH插件如何远程连接Linux
May 02 Servers
apache ftpserver搭建ftp服务器
May 20 Servers
使用Nginx+Tomcat实现负载均衡的全过程
May 30 Servers
GPU服务器的多用户配置方法
Jul 07 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
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
Bootstrap每天必学之前端开发框架
2015/11/19 Javascript
JS基础随笔(菜鸟必看篇)
2016/07/13 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
python之文件读取一行一行的方法
2018/07/12 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
Django工程的分层结构详解
2019/07/18 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
Python实现密码薄文件读写操作
2019/12/16 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
2020/03/09 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
HTML5图片预览实例分享
2014/06/04 HTML / CSS
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
英国高街电视:High Street TV
2018/05/22 全球购物
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
大学生个人简历自我评价
2013/11/16 职场文书
大学生实习鉴定评语
2014/04/25 职场文书
还款承诺书范文
2014/05/20 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
公司离职证明标准范本
2014/10/05 职场文书
2014年教研员工作总结
2014/12/23 职场文书
Django实现在线无水印抖音视频下载(附源码及地址)
2021/05/06 Python
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python
CSS的calc函数用法小结
2022/06/25 HTML / CSS