Nginx 通过 Lua + Redis 实现动态封禁 IP

来源:segmentfault.com/a/1190000018267201

背景

为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单。对于黑名单之内的 IP ,拒绝提供服务。

架构

实现 IP 黑名单的功能有很多途径:

1、在操作系统层面,配置 iptables,拒绝指定 IP 的网络请求;

2、在 Web Server 层面,通过 Nginx 自身的 deny 选项 或者 lua 插件 配置 IP 黑名单;

3、在应用层面,在请求服务之前检查一遍客户端 IP 是否在黑名单。

为了方便管理和共享,我们选择通过 Nginx+Lua+Redis 的架构实现 IP 黑名单的功能,架构图如下:

b88bb66fbd71bc8fb98f93664f2ef3a1.png

实现

1、安装 Nginx+Lua模块,推荐使用 OpenResty,这是一个集成了各种 Lua 模块的 Nginx 服务器:

80e5c4ec6965ca4ea6d9749cf6cf3033.png

2、安装并启动 Redis 服务器;

3、配置 Nginx 示例:

3be7d72887bb44c44d060a845f97813e.png

Nginx 配置

其中

lua_shared_dict ip_blacklist 1m;

由 Nginx 进程分配一块 1M 大小的共享内存空间,用来缓存 IP 黑名单。

access_by_lua_file lua/ip_blacklist.lua;

指定 lua 脚本位置。

4、配置 lua 脚本,定期从 Redis 获取最新的 IP 黑名单。

6cf15771eee2253d4d544b2d1ec45689.png

5、在 Redis 服务器上新建 Set 类型的数据 ip_blacklist,并加入最新的 IP 黑名单。

完成以上步骤后,重新加载 nginx,配置便开始生效了。这时访问服务器,如果你的 IP 地址在黑名单内的话,将出现拒绝访问,如下图:

937718cca3b29032fee8f5302212577b.png

总结

以上,便是 Nginx+Lua+Redis 实现的 IP 黑名单功能,具有如下优点:

  • 配置简单、轻量,几乎对服务器性能不产生影响;

  • 多台服务器可以通过Redis实例共享黑名单;

  • 动态配置,可以手工或者通过某种自动化的方式设置 Redis 中的黑名单。

技术学习交流群

 「架构君」建立了读者群,可以添加我微信拉你进群

6dd006a908a36e9414cb2bedc4386288.png

添加时可以备注城市+职位+年限】

分享一套家庭理财系统(附源码)

2021-09-20

92aaeb4e444cccdf3e12b5f600cb3382.png

推荐一套开源通用后台管理系统(附源码)

2021-08-21

458f6cf1c766d758c2448dbf89dd8650.png

推荐一个酷炫的监控系统

2021-08-07

631bf97b079073e08c3b0ff61571e92f.png

从朋友那里搞了 20 个实战项目,速领!

2021-06-14

8611b628767ee5ed8d612db1b46c5438.png

推荐一个完善的停车管理系统,物联网项目springboot,附源码

2021-05-30

9554ef20daceb61443e614129d677651.png

推荐一个互联网企业级别的开源支付系统

2021-09-04

0bc7982e4c1832f0dcdd625abc045c7f.png

一款神仙接私活儿软件,吊到不行!

2021-07-31

c3f728d61c98f06ddd90cc2a199a8c21.png

推荐 10 款超实用的企业级开源应用!

2021-10-17

e4c2fe499ae5705debbbf436434ffc5e.png

开放平台 SDK 设计实践!

2021-10-13

2eb46388a54d048e96708a675426ce38.png

“淘宝” 开放平台接口设计思路

2021-10-07

136fdfcc63c3404debb02d5c455e9a75.png

Spring中经典的9种设计模式

2021-10-05

346c80c7aa6793ccee3c852d7aabcd28.png

c21e705e1f37def7b22a39f799589e47.png

如有收获,点个在看,诚挚感谢5367d0f287a1a4df1e9cca397074559f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值