1.安装openresty-1.21.4.4
tar -xzvf openresty-1.21.4.4.tar.gz cd openresty-1.21.4.4 mkdir modules # 到 github中下载ngx_cache_purge-2.3,解压后放到 modules里面 wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz # 编译安装 openresty ./configure --prefix=/usr/local/openresty-1.21.4.4 --with-http_ssl_module --with-debug --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module --with-luajit --with-http_iconv_module --with-stream --with-stream_ssl_module --with-threads --with-http_gunzip_module --with-http_mp4_module --with-http_dav_module --with-http_sub_module --with-http_random_index_module --with-http_flv_module --with-http_auth_request_module --with-http_addition_module --with-http_v2_module --with-pcre --with-pcre-jit --without-http_redis2_module --with-http_geoip_module --with-http_secure_link_module --with-mail --with-mail_ssl_module --with-http_postgres_module --add-module=/usr/local/download/openresty-1.21.4.4/modules/ngx_cache_purge-2.3 gmake gmake install
2.安装 redis
自己安装并设置密码
3.lua脚本设置
脚本网上一堆,自己测试下
cd /usr/local/openresty-1.21.4.4 mkdir lua cat ipblock.lua ip_bind_time = 30 --封禁IP多长时间 ip_time_out = 10 --指定统计ip访问频率时间范围 connect_count = 10 --指定ip访问频率计数最大值 --上面的意思就是10秒内访问超过10次,自动封 IP 30秒,实际测试下来 6 次就封了。 --连接redis local redis = require "resty.redis" local cache = redis.new() local ok , err = cache.connect(cache,"10.1.1.240","6380") -- redis密码 local res, err = cache:auth("wg1q2w3e") cache:set_timeout(60000) --如果连接失败,跳转到脚本结尾 if not ok then goto Lastend end --查询ip是否在封禁段内,若在则返回403错误代码 --因封禁时间会大于ip记录时间,故此处不对ip时间key和计数key做处理 is_bind , err = cache:get("bind_"..ngx.var.remote_addr) if is_bind == '1' then ngx.exit(ngx.HTTP_FORBIDDEN) -- 或者 ngx.exit(403) -- 当然,你也可以返回500错误啥的,搞一个500页面,提示,亲您访问太频繁啥的。 goto Lastend end start_time , err = cache:get("time_"..ngx.var.remote_addr) ip_count , err = cache:get("count_"..ngx.var.remote_addr) --如果ip记录时间大于指定时间间隔或者记录时间或者不存在ip时间key则重置时间key和计数key --如果ip时间key小于时间间隔,则ip计数+1,且如果ip计数大于ip频率计数,则设置ip的封禁key为1 --同时设置封禁key的过期时间为封禁ip的时间 if start_time == ngx.null or os.time() - start_time > ip_time_out then res , err = cache:set("time_"..ngx.var.remote_addr , os.time()) res , err = cache:set("count_"..ngx.var.remote_addr , 1) else ip_count = ip_count + 1 res , err = cache:incr("count_"..ngx.var.remote_addr) if ip_count >= connect_count then res , err = cache:set("bind_"..ngx.var.remote_addr,1) res , err = cache:expire("bind_"..ngx.var.remote_addr,ip_bind_time) --fix keys end end --结尾标记 ::Lastend:: local ok, err = cache:close()
4.openreststy启动
cat localhost.conf server { listen 80; server_name localhost; location / { root html; index index.html index.htm; access_by_lua_file "/usr/local/openresty-1.21.4.4/lua/ipblock.lua"; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } access_log /data/logs/nginx/localhost_acc.log; error_log /data/logs/nginx/localhost_err.log; }
5.访问并查看 redis数据
http://IP 统计刷新次数,查看日志
查看 redis
标签:http,--,IP,cache,redis,module,lua,ip,ngx From: https://www.cnblogs.com/yangmeichong/p/18396214