当前位置: 首页 > news >正文

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

背景

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

架构

实现 IP 黑名单的功能有很多途径:
1、在操作系统层面,配置 iptables,拒绝指定 IP 的网络请求;
2、在 Web Server 层面,通过 Nginx 自身的 deny 选项 或者 lua 插件 配置 IP 黑名单;
3、在应用层面,在请求服务之前检查一遍客户端 IP 是否在黑名单。

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

实现

1、安装 Nginx+Lua模块,推荐使用 OpenResty,这是一个集成了各种 Lua 模块的 Nginx 服务器:
在这里插入图片描述
2、安装并启动 Redis 服务器;
3、配置 Nginx 示例:
在这里插入图片描述

Nginx 配置

其中

lua_shared_dict ip_blacklist 1m;

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

access_by_lua_file lua/ip_blacklist.lua;

指定 lua 脚本位置。

4、配置 lua 脚本,定期从 Redis 获取最新的 IP 黑名单。
在这里插入图片描述
5、在 Redis 服务器上新建 Set 类型的数据 ip_blacklist,并加入最新的 IP 黑名单。

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

总结

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

1、配置简单、轻量,几乎对服务器性能不产生影响;
2、多台服务器可以通过Redis实例共享黑名单;
3、动态配置,可以手工或者通过某种自动化的方式设置 Redis 中的黑名单。

相关文章:

  • 前端性能优化--懒加载和预加载
  • 如何封装使用api形式调用的vue组件
  • 小白修神传~程序员成神之路
  • 26、springboot与消息
  • Javascript基础之Array数组API
  • redhat6.4提权Ⅱ
  • 运算符和自增自减
  • ☆1033
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • linux下实用的快速随机生成复杂密码
  • 互联网世界,联通你我,这40张图送给你!让你笑到肚子疼!
  • WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 手写双向链表LinkedList的几个常用功能
  • Python中eval与exec的使用及区别
  • 深入了解以太坊
  • [译]前端离线指南(上)
  • 【5+】跨webview多页面 触发事件(二)
  • 【技术性】Search知识
  • Cumulo 的 ClojureScript 模块已经成型
  • HashMap ConcurrentHashMap
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript实现分页效果
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • java多线程
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • VUE es6技巧写法(持续更新中~~~)
  • Vue2 SSR 的优化之旅
  • webpack入门学习手记(二)
  • 分布式任务队列Celery
  • 复杂数据处理
  • 关于 Cirru Editor 存储格式
  • 目录与文件属性:编写ls
  • 思维导图—你不知道的JavaScript中卷
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #QT(串口助手-界面)
  • (09)Hive——CTE 公共表达式
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (42)STM32——LCD显示屏实验笔记
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (四)Android布局类型(线性布局LinearLayout)
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net访问oracle数据库性能问题
  • .Net接口调试与案例
  • /bin/bash^M: bad interpreter: No such file or directory
  • :中兴通讯为何成功
  • @EnableAsync和@Async开始异步任务支持
  • @RequestMapping-占位符映射
  • [1525]字符统计2 (哈希)SDUT