动态换ip如何实现_通过OpenResty实现nginx动态拉黑IP

前面提到过,nginx在项目中的作用。其实还有很多高级模块功能,例如今天我们利用OpenResty来防止一些IP恶意攻击。

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

官方地址:http://openresty.org/cn/

环境搭建

本文使用centos 7进行操作,安装nginx,本处安装nginx并非是openresty前提,只是为了演示openresty安装后,访问地址会将nginx变成openresty

wget下载

wget http://nginx.org/download/nginx-1.19.5.tar.gz
3eddb5e402c635146f3870224dc8dd12.png

解压并执行安装命令

tar -zxvf nginx-1.19.5.tar.gz #解压cd nginx-1.19.5 #进入目录./configure #配置make #编译make install #安装cd /usr/local/nginx/sbin #切换到nginx命令目录./nginx #启动nginx

访问地址

8168eb41b15bfb93f6ac857c9d85953f.png

安装openresty,先下载openresty,

wget https://openresty.org/download/openresty-1.19.3.1.tar.gz(此版本最终一直无法加载一些lua脚本,最终使用openresty-1.15.8.3版本成功)
0c32289f3e1a118e3e85ef9655a1d2c8.png

解压&安装

tar -zxvf openresty-1.19.3.1.tar.gzcd openresty-1.19.3.1yum install pcre-devel openssl-devel gcc curl ./configuremakemake install

执行完后,我们启动openresty中得nginx,注意,切换到openresty安装得路径

/usr/local/openresty/nginx/sbin

启动后,访问,发现nginx变成了openresty

518b654b6e7b43c2bb1c31074ffb3767.png

配置nginx.conf

测试lua功能

d2dd4c66132e1b31c889f5f062d82786.png
5d6791c25f81ea04ca532fb2c57fe5a4.png

可以看到已经可以使用lua脚本,下面我们将redis sdk引用进来

a2db42eaff9f24177aa5431fd2fa4659.png

配置请求路径访问lua脚本(本处只是做一个demo,如果对所有路径进行访问限制,可以拦截/,然后lua验证通过后,进行请求转发)

a17a369c87c8a453b8dbd6b66e4ce1a5.png

lua脚本

# Lualocal function close_redis(redcli)    if not redcli then        return    end    --释放连接(连接池实现)    local pool_max_idle_time = 10000 --毫秒    local pool_size = 100 --连接池大小    local ok, err = redcli:set_keepalive(pool_max_idle_time, pool_size)    if not ok then        ngx_log(ngx_ERR, "set redis keepalive error : ", err)    endend-- 连接redislocal redis = require('resty.redis')local redcli = redis.new()redcli:set_timeout(1000)local ip = "127.0.0.1"  ---修改变量local port = "6379" ---修改变量local ok, err = redcli:connect(ip,port)if not ok then    return close_redis(redcli)endlocal clientIP = ngx.var.remote_addr-- increKey为请求频率,blackKey黑名单keylocal incrKey = "user:"..clientIP..":request:frequency"local blackKey = "user:"..clientIP..":black:list"local is_black,err = redcli:get(blackKey)if tonumber(is_black) == 1 then    ngx.exit(403)    close_redis(redcli)endinc  = redcli:incr(incrKey)ngx.say(inc)if inc < 2 then   inc = redcli:expire(incrKey,1)endif inc > 2 then --每秒2次以上访问即视为非法,会阻止30s的访问    redcli:set(blackKey,1)    redcli:expire(blackKey,30)endclose_redis(redcli)

启动nginx后,请求一直报错

4ed951cf9f0d56f4cc88e04ea030e295.png
2020/12/01 19:13:53 [error] 2101#0: *2 lua entry thread aborted: runtime error: /usr/local/openresty/nginx/lua/access_by_redis.lua:29: attempt to call field 'get_headers' (a nil value)stack traceback:coroutine 0:        /usr/local/openresty/nginx/lua/access_by_redis.lua: in main chunk, client: 192.168.49.1, server: localhost, request: "GET /test1 HTTP/1.1", host: "192.168.49.131"

这个问题困扰了我很久(凡是不要一上来就最新版本,吐血说明)

windows版本的openresty并没有出现此问题,liunux一直都有问题,最终降低了openresty版本,实验成功,openresty-1.15.8.3版本

正常请求

7ad2c0c487dcb7b4aff6258e36859396.png

异常请求

ad5396b2f213e3cbf99d45fc2316cea7.png

最后openresty的运行周期图如下,可以从整体上了解openresty

872cf8ffd7992b4718020f8d0101dcf4.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值