lua+nginx实现黑名单禁止访问的示例代码

 更新时间:2025年11月05日 09:42:26   作者:蚊子爱喝水  
本文介绍如何使用Nginx与Lua脚本通过OpenResty平台实现高效的IP黑名单功能,利用Redis存储黑名单,定时更新共享内存字典,防止恶意IP访问,感兴趣的可以了解一下

可以使用基于 Nginx 与 Lua 的高性能 Web 平台OpenResty。 OpenResty地址

安装简单,略去。

 # 分配内存
    lua_shared_dict ip_blacklist 1m;
 
    server {
        listen       80;
        server_name  localhost;
 
        root   E:/www/web/test;
 
        access_log  logs/host.access.log ;
        error_log  logs/host.error.log;
 
        location / {
            access_by_lua_file ../lua/black.lua;
            index  index.html index.htm;
        }
 
 
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
 
        location ~ \.php$ {
        # 指定lua文件
            access_by_lua_file "D:\openresty-1.15.8.1-win64/lua/black.lua";
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

black.lua

local redis_host    = "127.0.0.1" -- 这里一定是redis的IP地址
local redis_port    = "6379"
 
-- connection timeout for redis in ms. don't set this too high!
local redis_connection_timeout = 1000
 
-- check a set with this key for blacklist entries
local redis_key     = "ip_blacklist"
 
-- cache lookups for this many seconds
local cache_ttl     = 100
 
-- end configuration
 
local ip                = ngx.var.remote_addr
local ip_blacklist              = ngx.shared.ip_blacklist
local last_update_time  = ip_blacklist:get("last_update_time");
 
-- only update ip_blacklist from Redis once every cache_ttl seconds:
if last_update_time == nil or last_update_time < ( ngx.now() - cache_ttl ) then
 
  local redis = require "resty.redis";
  local red = redis:new();
 
  red:set_timeout(redis_connect_timeout);
 
  local ok, err = red:connect(redis_host, redis_port);
 
  if not ok then
    ngx.say("redis connect failed: ", err)
    ngx.log(ngx.DEBUG, "Redis connection error while retrieving ip_blacklist: " .. err);
    return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
  else
    -- local res, err = red:auth("foobared") -- 配置redis的密码
 
    --if not res then
        --ngx.say("redis auth is error: ", err)
        --return
    --end
    red:select(0) -- 设置redis的db
    local new_ip_blacklist, err = red:smembers(redis_key);
    if err then
      ngx.log(ngx.DEBUG, "Redis read error while retrieving ip_blacklist: " .. err);
    else
      -- replace the locally stored ip_blacklist with the updated values:
      ip_blacklist:flush_all();
      for index, banned_ip in ipairs(new_ip_blacklist) do
        ip_blacklist:set(banned_ip, true);
      end
 
      -- update time
      ip_blacklist:set("last_update_time", ngx.now());
    end
  end
end
 
 
if ip_blacklist:get(ip) then
  --ngx.say(ip)
  ngx.log(ngx.DEBUG, "Banned IP detected and refused access: " .. ip);
  return ngx.exit(ngx.HTTP_FORBIDDEN);
end

到此这篇关于lua+nginx实现黑名单禁止访问的示例代码的文章就介绍到这了,更多相关lua+nginx黑名单禁止访问内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • nginx的80端口无法被远程服务器访问的问题解决

    nginx的80端口无法被远程服务器访问的问题解决

    这篇文章主要介绍了nginx的80端口无法被远程服务器访问的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • Nginx为静态资源配置缓存时间的操作步骤

    Nginx为静态资源配置缓存时间的操作步骤

    最近在优化网站性能时,发现很多静态资源(比如图片、CSS 文件等)每次都会从服务器重新加载,这不仅浪费了带宽,还增加了 服务器的负载,为了解决这个问题,我研究了一下如何在 Nginx 中为静态资源配置缓存时间,下面是我的配置过程,需要的朋友可以参考下
    2025-02-02
  • 前端必备Nginx配置详解

    前端必备Nginx配置详解

    这篇文章主要介绍了前端必备Nginx配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Nginx服务器搭建反向代理全攻略

    Nginx服务器搭建反向代理全攻略

    这篇文章主要介绍了Nginx服务器搭建反向代理全攻略,强大的反向代理功能也是人们选择使用Nginx的主要原因之一,需要的朋友可以参考下
    2015-08-08
  • nginx反向代理服务器及负载均衡服务配置方法

    nginx反向代理服务器及负载均衡服务配置方法

    正向代理一般是在客户端设置代理服务器,通过代理服务器转发请求,最终访问到目标服务器,这篇文章主要介绍了nginx反向代理服务器及负载均衡服务配置方法,需要的朋友可以参考下
    2023-12-12
  • 实现Nginx中使用PHP-FPM时记录PHP错误日志的配置方法

    实现Nginx中使用PHP-FPM时记录PHP错误日志的配置方法

    最近在本地搭建的LNMP的开发环境。为了开发的时候不影响前端的正常开发就屏蔽的PHP里面php.ini中的一些错误提示。但是这样一来,就影响到了后端开发的一些问题比如不能及时调试开发中的一些问题
    2014-05-05
  • Nginx部署https网站并配置地址重写的步骤详解

    Nginx部署https网站并配置地址重写的步骤详解

    今天小编就为大家分享一篇关于Nginx部署https网站并配置地址重写的步骤详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Nginx实现接口复制的示例代码

    Nginx实现接口复制的示例代码

    本文主要介绍了使用Nginx的mirror指令和Lua脚本实现接口流复制,方便将请求同时转发到多个后端服务器,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • nginx平滑重启和平滑升级的图文教程

    nginx平滑重启和平滑升级的图文教程

    如果改变了Nginx的配置文件(nginx.conf),想重启Nginx,可以发送系统信号给Nginx主进程的方式来进行,下面这篇文章主要给大家介绍了关于nginx平滑重启和平滑升级的相关资料,需要的朋友可以参考下
    2022-01-01
  • Nginx双机热备的实现步骤

    Nginx双机热备的实现步骤

    本文主要介绍了Nginx双机热备的实现步骤,是国内企业中最为普遍的一种高可用方案,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05

最新评论