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

news2024/11/24 1:25:45

实时黑名单系统,如果用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 then
    local function redis_connect()
        local redis = require "resty.redis"
        local redis_host = "127.0.0.1"
        local pool_size = 1000
        red = 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 red
    end
    
    redis_connect_code = string.dump(redis_connect)
    my_cache:set('redis_connect',redis_connect_code)
end

local ip = ngx.var.remote_addr

if ip == '192.168.1.102' then
    ngx.exit(ngx.OK)
end

local 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 then
    red: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.coloradmin.cn/o/2197721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据分享】全国地级市2000-2022年公路里程数据(Shp/Excel格式)

公路里程是表征城市建设的重要指标!我们发现在各省市统计年鉴、经济社会发展统计中有公路里程数据,例如下图为2022年南京统计年鉴中统计的2021年和2020年的南京市公路里程数据: 我们特地从2001-2023年各省级/市级年鉴中汇总整理了全国地级市的…

PCL 将点云的曲率数据保存至txt

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 计算点云曲率 2.1.2 将曲率保存到txt文件 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新…

【论文速看】DL最新进展20241008-多模态、医学图像分割、扩散模型

目录 【多模态】【医学图像分割】【扩散模型】 【多模态】 PaliGemma: A versatile 3B VLM for transfer 研究机构:google 论文链接:https://arxiv.org/pdf/2407.07726 模型及其说明链接:https://huggingface.co/google/paligemma-3b-pt-22…

leetcode68:文本左右对齐

给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可…

RWKV-7 预览版、大量新论文...RWKV 社区 9 月动态速览

欢迎大家收看《RWKV 社区最新动态》第五期,本期内容收录了 RWKV 社区 2024 年 9 月的最新动态。 9 月动态省流版(TL;DR) RWKV 官方新闻动态 RWKV-7 发布预览版RWKV-7 论文撰写已面向社区开放RWKV 官网上线 Bad Case 收集页面RWKV 中文文档已…

攻防世界---->sherlock

做题笔记。 下载。 单词中出现大写很可疑。因为大写最多出现在开头等。 猜测是隐写术。 进行筛选。 借助python实现 with open(C:\\Users\\Acer\\Downloads\\f590c0f99c014b01a5ab8b611b46c57c.txt, r) as file:text file.read() uppercase_letters [char for char in text…

手撕数据结构 —— 顺序表(C语言讲解)

目录 1.顺序表简介 什么是顺序表 顺序表的分类 2.顺序表的实现 SeqList.h中接口总览 具体实现 顺序表的定义 顺序表的初始化 顺序表的销毁 打印顺序表 ​编辑 检查顺序表的容量 尾插 尾删 ​编辑 头插 头删 查找 在pos位置插入元素 删除pos位置的值 ​…

内核驱动-如何编译内核以及给内核中添加新文件

1.编译内核 想要编译内核,首先需要先下载内核源代码。可以在官方网站下载源代码压缩包,然后放在Ubuntu的目录下,然后解压(解压的指令为:sudo tar -xvf xxxx.gz)。解压之后在当前目录下可以看到解压之后的文…

java8 双冒号(::)使用方法

双冒号(::)运算符是跟函数式接口相关的运算符,作为函数式接口的赋值操作。 双冒号用于静态方法 使用方法:将类的静态方法赋值给一个函数式接口,静态方法的参数个数、类型要跟函数式的接口一致。调用这个函数式接口就…

数字化转型:别让技术迷了眼,战略觉醒才是关键。新媒体营销大客户销售AIGC大模型创新思维专家培训讲师谈数字化转型商业模式短视频内容社私域数字经济人工智能

​数字化转型从根本上讲不是关于技术,而是关于战略。 数字化转型使用新的数字技术来实现重大的业务改进,如增强客户体验、精简运营或创建新的商业模式。数字化转型描述了一家公司试图为数字时代做好准备的旅程。 数字化转型不是关于技术或获取新的技术技能。事实上,它是关于获得…

永磁同步电机环路反步法(backstepping)控制

文章目录 1、反步控制原理1.1 李雅普诺夫稳定性定理1.2 严格反馈系统1.3 一般设计流程 2、永磁同步电机反步控制2.1 反步控制器设计2.2 反步控制仿真 参考 写在前面:本人能力、时间、技术有限,没有对一些细节进行深入研究和分析,也难免有不足…

简易CPU设计入门:取指令(四)

项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff…

SOMEIP_ETS_174: SD_Unknown_Option_type

测试目的: 验证DUT能够拒绝一个引用了未知选项类型的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个引用了未知选项类型的SubscribeEventgroup消息时&#xff0…

Solidedge二次开发(C#)-将dft文件转换为dwg格式文件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在Solid Edge中创建一个par文件3、通过二次开发将dft转换为dwg4、结果显示1、前言 Solid Edge提供了将dft转换为dwg的接口,也即是保存功能。有时在不显示Solid Edge界面的情况下,将其…

【C语言刷力扣】1436.旅行终点站

题目: 解题思路: 两层循环查找,第一次循环中初始化 destination 为 path中每次旅行的终点作为最终的终点。二次循环查找当前 destination ,若是作为某次旅行的起点,说明不是最后的终点。 char* destCity(char ***paths…

[Linux#62][TCP] 首位长度:封装与分用 | 序号:可靠性原理 | 滑动窗口:流量控制

目录 一. 认识TCP协议的报头 1.TCP头部格式 2. TCP协议的特点 二. TCP如何封装与分用 TCP 报文封装与解包 如何封装解包,如何分用 分离有效载荷 隐含问题:TCP 与 UDP 报头的区别 封装和解包的逆向过程 如何分用 TCP 报文 如何通过端口号找到绑…

多功能快捷回复软件

各位亲爱的客服宝宝们,每天面对大量的客户咨询,您是否还在手动一个一个地打字回复呢?别担心,我们为您带来了一款多功能快捷回复软件——客服宝。有了它,您的工作将变得无比轻松! 客服宝是一款集成了内容存储…

网络编程(14)——基于单例模板实现的逻辑层

十四、day14 今天学习如何通过单例模板实现逻辑层 1. 利用C11特性封装单例模板 和上一节设计的单例模板有些不同,本节设计的单例模板利用了以下四个C11新特性,优化了代码 unique_lock和lock_guard once_flag和call_once std::function condition_v…

1打家劫舍三部曲

刷题刷题找工作! s198.打家劫舍 动态规划:开始打家劫舍! dp数组表示到第i家的最高金额 dp递归公式,要么抢劫这家,加上i-2所抢的钱,要么不抢,保留上一家的。 …

linux中的火墙优化策略

1.火墙介绍 1. netfilter 2. iptables 3. iptables | firewalld 2.火墙管理工具切换 在rocky9 中默认使用的是 firewalld firewalld -----> iptables dnf install iptables - services - y systemctl stop firewalld systemctl disable firewalld systemctl mask fi…