2019独角兽企业重金招聘Python工程师标准>>>

nginx+lua+redis实现ip黑名单

1.安装LuaJIT

LuaJIT LuaJIT即采用C语言写的Lua代码的解释器

http://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar -zxf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
make && make install PREFIX=/usr/local/data/luavim /etc/ld.so.conf
/usr/local/data/lua/lib     #添加
ldconfig     #运行命令使其生效

2.安装Ngx_lua模块

https://codeload.github.com/simpl/ngx_devel_kit/zip/master     #zip格式
https://codeload.github.com/openresty/lua-nginx-module/zip/master     #zip格式

ngx_devele_kit 一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现 lua-nginx-module lua的nginx模块

export LUAJIT_LIB=/usr/local/data/lua/lib/
export LUAJIT_INC=/usr/local/data/lua/include/luajit-2.0/

需要重新编译nginx

./configure --prefix=/usr/local/data/nginx --user=goforit --group=goforit --prefix=/usr/local/data/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=../ngx_devel_kit --add-module=../lua-nginx-module && make
mv /usr/local/data/nginx/sbin/nginx /usr/local/data/nginx/sbin/nginx.old
cp objs/nginx /usr/local/data/nginx/sbin/nginx
/usr/local/data/nginx/sbin/nginx -t /usr/local/data/nginx/conf/nginx.conf
kill -USR2 `cat /usr/local/data/nginx/logs/nginx.pid`
kill -WINCH `cat /usr/local/data/nginx/logs/nginx.pid.oldbin`
kill -HUP `cat /usr/local/data/nginx/logs/nginx.pid.oldbin`
kill -QUIT `cat /usr/local/data/nginx/logs/nginx.pid.oldbin`

3.测试lua是否生效 修改nginx配置

location ~ /lua {default_type 'text/plain';content_by_lua 'ngx.say("hello, lua!")';
}

测试访问 http://192.169.100.105/lua 输出,hello,lua!即可

4.安装redis服务启动

yum -y install redis
/etc/init.d/redis start

5.安装lua redis库

下载

https://codeload.github.com/openresty/lua-resty-redis/zip/master

放到/usr/local/nginx/lua下即可 nginx.conf添加

lua_package_path "/usr/local/data/nginx/lua/lua-resty-redis/lib/?.lua;;";

重载nginx即可

6.配置nginx限制IP地址 nginx.conf添加

lua_shared_dict ip_blacklist 1m;
server{}中添加
locaiont ~ \.php {.........access_by_lua_file /usr/local/data/nginx/conf/lua/ip_blacklist.lua;     #配置文件在下面default_type 'text/html';#content_by_lua 'ngx.say("hello,lua!")';
}
vim ip_blacklist.lua
-- a quick LUA access script for nginx to check IP addresses against an
-- `ip_blacklist` set in Redis, and if a match is found send a HTTP 403.
--
-- allows for a common blacklist to be shared between a bunch of nginx
-- web servers using a remote redis instance. lookups are cached for a
-- configurable period of time.
--
-- block an ip:
--   redis-cli SADD ip_blacklist 10.1.1.1
-- remove an ip:
--   redis-cli SREM ip_blacklist 10.1.1.1
--
-- also requires lua-resty-redis from:
--   https://github.com/agentzh/lua-resty-redis
--
-- your nginx http context should contain something similar to the
-- below: (assumes resty/redis.lua exists in /etc/nginx/lua/)
--
--   lua_package_path "/etc/nginx/lua/?.lua;;";
--   lua_shared_dict ip_blacklist 1m;
--
-- you can then use the below (adjust path where necessary) to check
-- against the blacklist in a http, server, location, if context:
--
-- access_by_lua_file /etc/nginx/lua/ip_blacklist.lua;
--
-- from https://gist.github.com/chrisboulton/6043871
-- modify by Ceeloglocal redis_host    = "192.169.100."
local redis_port    = 6379
local redis_pass    = "Redis2016"-- connection timeout for redis in ms. don't set this too high!
local redis_connection_timeout = 100-- check a set with this key for blacklist entries
local redis_key     = "ip_blacklist"-- cache lookups for this many seconds
local cache_ttl     = 60-- end configurationlocal 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 ) thenlocal redis = require "resty.redis";local red = redis:new();red:set_timeout(redis_connection_timeout);local ok, err = red:connect(redis_host, redis_port);local ok2, err2 = red:auth(redis_pass)red:select(1)if not ok thenngx.log(ngx.DEBUG, "Redis connection error while retrieving ip_blacklist: " .. err);elselocal new_ip_blacklist, err = red:smembers(redis_key);if err thenngx.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) doip_blacklist:set(banned_ip, true);end-- update timeip_blacklist:set("last_update_time", ngx.now());endend
endif ip_blacklist:get(ip) thenngx.log(ngx.DEBUG, "Banned IP detected and refused access: " .. ip);return ngx.exit(ngx.HTTP_FORBIDDEN);
end

在redis里添加IP地址测试

SADD ip_blacklist 192.168.100.1     #添加地址
SREM ip_blacklist 192.168.100.1     #删除地址
SMEMBERS ip_blacklist     #查看所有地址

reload nginx 测试即可 会发现访问状态是403

参考文章:

http://www.cnblogs.com/tinywan/p/6534151.html

http://blog.csdn.net/hj7jay/article/details/62037065

https://my.oschina.net/sakmon/blog/393917

遇到错误: 1.错误

/usr/local/data/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

解决:

vim /etc/ld.so.conf/usr/local/data/lua/lib     #添加ldconfig     #即可
2.报错2017/08/16 17:00:25 [error] 3795#0: *64 lua entry thread aborted: runtime error: /usr/local/nginx/conf/lua/ip_blacklist.lua:51: module 'resty.redis' not found:no field package.preload['resty.redis']no file '/usr/local/nginx/lua/lua-resty-redis/lib/resty/redis.lua'no file './resty/redis.lua'no file '/usr/local/share/luajit-2.0.5/resty/redis.lua'no file '/usr/local/share/lua/5.1/resty/redis.lua'no file '/usr/local/share/lua/5.1/resty/redis/init.lua'no file './resty/redis.so'no file '/usr/local/lib/lua/5.1/resty/redis.so'no file '/usr/local/lib/lua/5.1/loadall.so'no file './resty.so'no file '/usr/local/lib/lua/5.1/resty.so'no file '/usr/local/lib/lua/5.1/loadall.so'
stack traceback:
coroutine 0:[C]: in function 'require'/usr/local/nginx/conf/lua/ip_blacklist.lua:51: in function </usr/local/nginx/conf/lua/ip_blacklist.lua:1>, client: 192.169.100.1, server: mytest.com, request: "GET /ipblacklist HTTP/1.1", host: "192.169.100.105"

解决: 缺少相关库 下载

 https://codeload.github.com/openresty/lua-resty-redis/zip/master
 放到/usr/local/nginx/lua下即可nginx.conf添加
 lua_package_path "/usr/local/data/nginx/lua/lua-resty-redis/lib/?.lua;;";

重载nginx即可

转载于:https://my.oschina.net/2726276586/blog/1512212

nginx+lua+redis deny ip相关推荐

  1. nginx lua redis 访问频率限制(转)

    1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的 ...

  2. nginx+lua+redis 灰度发布实现方案

    背景: 公司要把现有的某传统项目进行微服务化,拆分后要分批次预发布,实现某部分使用户使用微服务模块,其他用户使用传统项目.待微服务稳定.无bug后全部用户迁移至微服务系统. 以上为背景,实现此方案使用 ...

  3. Nginx+Lua+Redis 对请求进行限制

    Nginx+Lua+Redis 对请求进行限制 一.概述 需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器 ...

  4. nginx+lua+redis实现降级

    前言 商城或web站点的用户访问量出乎意料地增加了很多,超出了系统的负载能力, 系统有些扛不住,继而导致注 册,下单,支付什么的全部在绕圈卡住,继而导致公司业务损失了不少用户和订单.. 一.引子 面对 ...

  5. 利用nginx+lua+redis实现反向代理方法教程

    这篇文章主要给大家介绍了利用nginx+lua+redis实现反向代理方法教程,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 前言 最近因为工作需要,要进行IVR的 ...

  6. windows下nginx+lua+redis实现短域名服务

    nginx+lua+redis 环境搭建: 我使用的是大牛 ZhangYichun 提供的集成包快速安装. 非常简单,下载 ngx_openresty,该集成包中有:Nginx,Lua或Luajit, ...

  7. 基于abtest思想的流量切换(nginx lua redis)

    使用前提: 项目重构了,旧项目还在线上运行,新项目准备替换线上的旧项目 最终目标: 要实现实时切换新旧项目,保证如果新项目上线后有问题,可以立刻快速的将流量切回旧项目 方案: 关于abtest的基本原 ...

  8. nginx+lua+redis实现post请求接口之黑名单(一)

    一.概述 需求:所有访问/webapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器(Tomcat) 实现思路:通过在Nginx上 ...

  9. Nginx + Lua + redis (一)(转)

    使用 Lua 脚本语言操作 Redis. 由于大量的 Lua 代码写在 Nginx 中,会使配置文件显得很繁琐,所以这里使用 content_by_lua_file 来引入 Lua 脚本文件. 要使用 ...

最新文章

  1. Java中的关于static的解释和应用
  2. 既可输入又可选择的组件
  3. 医学影像设备学_2020考研:影像大咖告诉你,学影像,就业好,不求人。
  4. pythonargmaxaxis1_np.argmax(input,axis)和tf.argmax(input,axis)使用
  5. 软件架构(6)---软件架构设计的过程
  6. 小米:停止2016年发布的红米手机升级推送
  7. CISCO基础之局域网交换机配置
  8. 服务器存储技术千人群为:39472354
  9. .netcore 如何获取系统中所有session_C#/.NET/.NET Core定时任务调度组件有哪些?
  10. 联想G480安装CentOS电缆驱动器
  11. 梅花雪树控件的属性及方法
  12. m4s格式转换mp3_音乐怎么转换mp3格式
  13. 服务器2012系统如何备份数据库备份,windows 2012服务器数据库备份
  14. Google Guava的5个鲜为人知的特性
  15. 记一次阿里java实习生面试(失败)
  16. ABBYY FineReader Server 与杂乱无章的较量。我们的解决方案如何去除重复内容,让商业文档井井有条?
  17. hive窗口函数-leg()、lead() 上次下次获取
  18. mysql语句计算距离_mysql查询中的距离计算
  19. cloudmaker一个云架构的画图工具也支持自动化部署,界面清爽功能好用
  20. mac系统下怎么使用git

热门文章

  1. LINUX入侵检测指导
  2. redis专题:redis集群的动态扩容缩容,水平扩展
  3. 扩展RocketMQ 使其支持任意时间精度的消息延迟
  4. JavaFX中将FXML文件自动转换为Java代码
  5. Java多线程编程核心技术-多线程基础使用
  6. 图像目标检测(Object Detection)原理与实现(二)
  7. 再谈 Linux下的nanosleep函数
  8. ElasticSearch常用的分词器
  9. nacos服务注册与发现
  10. 在思科模拟器上完成基于服务器的AAA实验