Ngx+Lua+Redis 实时IP黑名单系统

实时黑名单系统,如果用php脚本实现很容易,但是效率惨不忍睹呀。
要想速度快还的在nginx层实现阻塞。如果iptables 层阻塞速度更快,但是黑名单列表如果有更新就必须要重载配置,实现还是有难度的。php管理后台把黑名单ip写入到redis,nginx层使用lua脚本去redis查询ip是否在黑名单里,实现实时控制。

OpenResty就是嵌入了LuaJIT VM的Nginx,LuaJIT即采用C语言写的Lua代码的解释器。熟悉简单的Lua语言和nginx基础知识就可以上手开发简单功能了。

你可以单独安装OpenResty,如果是宝塔面板也可以直接切换版本 nginx openresty



直接上代码。
整个系统的瓶颈在redis,我们要优化redis连接,需要连接池。

lua_shared_dict my_cache 10m;
server
{ 
.........

先创建一个内存缓存区,名称:my_cache 容量:10m
ngx+lua 中没有全局变量我们需要把redis的链接函数存储到这个 my_cache 里面使用其他地方使用的时候直接读取缓存里的函数代码,再运行函数得到一个redis连接

local my_cache = ngx.shared.my_cache
local redis_connect_code = my_cache:get("redis_connect")if not redis_connect_code thenlocal function redis_connect()local redis = require "resty.redis"local redis_host = "127.0.0.1"local pool_size = 1000red = redis:new()red:set_timeout(1000) red:set_pool_size(pool_size)red:set_keepalive(10000,pool_size)red:connect(redis_host,6379)red:auth('635241')red:select(1)return redendredis_connect_code = string.dump(redis_connect)my_cache:set('redis_connect',redis_connect_code)
endlocal ip = ngx.var.remote_addrif ip == '192.168.1.102' thenngx.exit(ngx.OK)
endlocal redis_connect=loadstring(redis_connect_code)
local red=redis_connect()
red:hincrby('store_ip:01',ip,1)
local blacklist, err=red:sismember("store_ip:black",ip)
if blacklist==1 thenred:hincrby('store_ip:00',ip,1)ngx.exit(444)
end

以上是redis连接池代码好黑名单判断代码
把以上代码存储为 access.lua文件放到 /www/server/nginx/conf/ 目录

nginx站点vhosts配置文件

lua_shared_dict my_cache 10m;
server
{listen 80;listen 443 ssl;http2 on;...........default_type 'application/json';    access_by_lua_file /www/server/nginx/conf/access.lua;

在这里解释一点
default_type 'application/json';  强制返回json格式
access_by_lua_file /www/server/nginx/conf/access.lua; 这个代码就是引入上面的黑名单代码。
为什么不把这个代码放到  location / 里面,这样只阻塞api接口。

location / {
        access_by_lua_file /www/server/nginx/conf/access.lua;       
    } 
这样写似乎更规范?
但是我的项目用的是Laravel框架,这个框架需要伪静态配置,
location / {
    try_files $uri $uri/ /index.php?$query_string;
}
这样就 两个location / {}  配置就冲突了。
可不可以把两个 location / 整合到一个里面,是可以的。
但是这个伪静态需要放在所有 location的最后。而黑名单阻塞需要放到所有location的最前面,那就只能不写location  防到外层 server下,这样缺点是,任何请求都会黑名单阻塞,包括请求静态资源,比如一个图片或css文件都会触发黑名单阻塞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/445193.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万字详解AI实践,零手写编码用AI完成开发 + 数据清洗 + 数据处理 的每日新闻推荐,带你快速成为AI大神

用AIdify完成前后端开发数据处理和数据清洗。 引言数据获取和数据处理dify构建workflow进行数据清洗前端页面构建和前后端交互总结 引言 AI时代对开发人员的加强是非常明显的,一个开发人员可以依靠AI横跨数个自己不熟悉的领域包括前后端、算法等。让我们来做个实践…

生信初学者教程(二十八):单细胞数据标准化

文章目录 介绍加载R包导入数据消除测序深度影响评估细胞周期的影响识别高度可变的特征缩放数据降维聚类输出结果总结介绍 scRNA-seq的标准化是一个重要的预处理步骤,目的是消除技术变异(比如比如测序深度和基因长度等因素),使基因表达和/或样本之间的比较更加可靠。标准化方…

如何彻底掌握 JavaScript 23种设计模式

设计模式是解决特定问题的常用解决方案,它们可以帮助开发者编写更清晰、可维护、可扩展的代码。在 JavaScript 中,常见的设计模式可以分为三大类:创建型模式、结构型模式 和 行为型模式。本文将全面介绍 JavaScript 中常见的设计模式&#xf…

Java 日志打印

使用日志打印: private static Logger log LoggerFactory.getLogger(DeptController.class);RequestMapping("/depts")public Result list() { // System.out.println("查询全部部门数据");log.info("查询全部部门数据");ret…

pytorch 与 pytorch lightning, pytorch geometric 各个版本之间的关系

主要参考 官方的给出的意见; 1. pytorch 与 pytorch lightning 各个版本之间的关系 lightning 主要可以 适配多个版本的 torch; https://lightning.ai/docs/pytorch/latest/versioning.html#compatibility-matrix; 2. pytorch 与 pytorch geometric 各…

【AIGC】2022-NIPS-视频扩散模型

2022-NIPS-Video Diffusion Models 视频扩散模型摘要1. 引言2. 背景3. 视频扩散模型3.1. 重建引导采样以改进条件生成 4. 实验4.1. 无条件视频建模4.2. 视频预测4.3. 文本条件视频生成4.3.1 视频与图像建模的联合训练4.3.2 无分类器指导的效果4.3.3 更长序列的自回归视频扩展 5…

线程池简单原理

设置了isRun导致任务没有执行完是因为子线程在消费队列的时候的run内while循环取队列的值,如果isRun为flase会停掉所有线程,解决是不仅isRun为false还要求队列的数据10个全取出队列大小为0. 当线程池队列满的时候任务会不会丢 可以使用默认的rejectExc…

Superset SQL模板使用

使用背景 有时想让表的时间索引生效,而不是在最外层配置报表时,再套多一层时间范围。这时可以使用SQL模板 参考官方文档 https://superset.apache.org/docs/configuration/sql-templating/#:~:textSQL%20Lab%20and%20Explore%20supports%20Jinja 我…

面试题:Redis(二)

1. 面试题 2. MoreKey案列 事故案例 2.1 生成上如何限制key*/flushdb/flushall等危险命令的使用? 通过redis.conf配置文件中在SECURITY选项中禁用这些命令 2.2 不用key*避免卡顿那用什么? 用scan命令,类似mysql中的limit命令 语法&…

VSCode的常用插件(持续更新)

点击左边工具栏的“扩展”,在搜索栏中查找对应插件,点击“安装”,安装完成后右边界面的插件会显示“卸载”按钮。 1、中文(简体)语言包 2、Auto Rename Tag 修改开始标签,结束标签也会随之自动变化。 3、O…

《Windows PE》4.3 延迟加载导入表

延迟加载导入表(Delayed Import Table)是PE文件中的一个数据结构,用于实现延迟加载(Lazy Loading)外部函数的机制。 延迟加载是指在程序运行时,只有当需要使用某个外部函数时才进行加载和绑定,…

wms智能供应链仓储管理系统,一站式仓储管理产品溯源解决方案

几度WMS条码仓储 管理系统是公司凭借多年为制造企业信息化服务的经验积累,结合WMS、条码、ERP思想而设计的智能供应链仓储系统。 主要包括以下六大模块:库位管理、存货管理、来料管理、发料管理、成品管理、日常管理。WMS条码仓储管理系统,是…

Unity中搜索不到XR Interaction Toolkit包解决方法

问题: 针对Unity版本2020.3在中PackageManager可能搜素不到XR Interaction Toolkit包 在Package Manager中未显示XR Interaction Toolkit包 解决方法: Package manager左上角,点加号,选择 Add package from git URL..,…

21年408数据结构

第一题: 解析:q指针指向要被删除的元素,当这个元素是链表中唯一一个元素时,q指针和尾指针都指向同一个元素,那么在删除掉这个元素之前,需要将尾指针调整到指向头指针的位置,此时链表为空&#x…

说下SSL/TLS四次握手过程?

参考自:SSL/TLS四次握手过程是怎么样的?HTTPS、SSL、TLS三者之间的联系和区别 一.SSL/TLS 简介 SSL(Secure Socket Layer 安全套接层)是基于 HTTPS 下的一个协议加密层,用于解决 HTTP 在传输数据时使用明文而导致的不安全问题。 SSL 是 HT…

【数据结构】零碎知识点(易忘 / 易错)总结回顾

一、数据结构的概念 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 二、算法 算法(Algorithm)就是定义良好的计算过程,它取一个或一组的值为…

二分图算法总结 C++实现

总体概念 染色法 基本思路步骤 将所有的边及其相接的边用邻接表存储起来;遍历所有的点,找到未上色的点;用BFS将该点及其相接的点迭代上色;在上述染色步骤中,如果相邻点的颜色相同则无法形成二分图; 题目…

数据结构:单链表OJ题

目录 相交链表解题思路代码 环形链表(I)解题思路代码 环形链表(II)解题思路代码 随机链表的复制(深拷贝)解题思路代码 相交链表 题目描述: 案例: 题目链接:https://l…

FunASR离线文件转写服务开发指南-debian-10.13

FunASR离线文件转写服务开发指南-debian-10.13 服务器环境 debian10.13 64位 第一步 配置静态网卡 auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.4/etc/init.d/networking restart第…

【JVM】JMM

文章目录 前置的硬件知识什么是JMMJMM的三大特性JMM中定义的原子操作happens-before先行发生原则 前置的硬件知识 硬件存储体系: 运行速度从上到下依次减慢. 由于CPU的计算速度远超与内存的处理速度,所以CPU不会直接从内存中读写,而是将内存中的变量拷贝一份副本放到CPU高速…