就是x秒内刷新y次,自动执行某动作的功能
详情见本博客- -不要刷太猛哦
[audio:http://media.jybb.me/music/%E8%B0%A2%E5%AE%89%E7%90%AA%20-%20%E5%96%9C%E5%B8%96%E8%A1%97.mp3|autostart=yes]

1、编译安装lua(参考)
apt-get install git -y #其他系统自行更改 cd ~ git clone http://luajit.org/git/luajit-2.0.git cd luajit-2.0/ make make install ln -sf luajit-2.0.0-beta10 /usr/local/bin/luajit ln -sf /usr/local/lib/libluajit-5.1.so.2 /usr/lib/
2、下载ngx_devel_kit、lua-nginx-module、limit_req2_nginx_module和nginx
cd ~ git clone http://github.com/simpl/ngx_devel_kit.git git clone http://github.com/chaoslawful/lua-nginx-module.git git clone https://github.com/monadbobo/limit_req2_nginx_module wget http://nginx.org/download/nginx-1.4.0.tar.gz #nginx版本选自己喜欢的吧
3、安装nginx
tar zxvf nginx-1.4.0.tar.gz cd nginx-1.4.0 export LUAJIT_LIB=/usr/local/lib export LUAJIT_INC=/usr/local/include/luajit-2.0 ./configure --user=www --group=www --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --pid-path=/var/run/nginx.pid --conf-path=/etc/nginx/nginx.conf --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-google_perftools_module --with-ipv6 --with-http_sub_module --add-module=/root/ngx_devel_kit --add-module=/root/lua-nginx-module --add-module=/root/limit_req2_nginx_module #这里需要添加什么模块自己调整= = make make install
4、修改Nginx.conf,在http层加入(感谢 @LazyZhu)
limit_req2_zone $binary_remote_addr $request_uri zone=one:2m rate=6r/s; #第一个动作,1秒内刷新6次 limit_req2_zone $binary_remote_addr $uri zone=two:2m rate=18r/s; #第二个动作,1秒内刷新18次 limit_req2_zone $binary_remote_addr zone=three:2m rate=38r/s; #第三个动作,1秒内刷新38次 lua_shared_dict ips 2m;
Server段
server{
listen 80;
server_name example.com;
root /home/wwwroot/example.com;
location @banip1 {
default_type text/html;
set $ip $binary_remote_addr;
set $val a;
set $exptime 1; #限制时间
set $ipa $remote_addr;
access_by_lua '
local ips = ngx.shared.ips
local vala = ips:get(ngx.var.ip)
if vala == nil then
local setip = ips:set(ngx.var.ip, ngx.var.val, ngx.var.exptime)
ngx.say("IP: ", ngx.var.ipa, " 访问频率过高,将被限制 ", ngx.var.exptime, " 秒。")
else
ngx.exec(404)
end
';
}
location @banip2 {
default_type text/html;
set $ip $binary_remote_addr;
set $val b;
set $exptime 5; #限制时间
set $ipa $remote_addr;
access_by_lua '
local ips = ngx.shared.ips
local vala = ips:get(ngx.var.ip)
if vala == nil then
local setip = ips:set(ngx.var.ip, ngx.var.val, ngx.var.exptime)
ngx.say("IP: ", ngx.var.ipa, " 访问频率过高,将被限制 ", ngx.var.exptime, "秒。")
else
ngx.exec(404)
end
';
}
location @banip3 {
default_type text/html;
set $ip $binary_remote_addr;
set $val c;
set $exptime 3600; #限制时间
set $ipa $remote_addr;
access_by_lua '
local ips = ngx.shared.ips
local vala = ips:get(ngx.var.ip)
if vala == nil then
local setip = ips:set(ngx.var.ip, ngx.var.val, ngx.var.exptime)
ngx.say("IP: ", ngx.var.ipa, " 访问频率过高,将被限制 ", ngx.var.exptime, " 秒。")
else
ngx.exec(404)
end
';
}
location = /forbid1 {
rewrite ^ /forbid1.html break; #第一个动作显示的页面
}
location = /forbid2 {
rewrite ^ /forbid2.html break; #第二个动作显示的页面
}
location = /forbid3 {
return 444; #第三个动作,直接返回444
}
location / {
#...... 这里自己填写吧。。。。
set $ip $binary_remote_addr;
rewrite_by_lua '
local ips = ngx.shared.ips
local vala = ips:get(ngx.var.ip)
if vala == nil then
return
end
if vala == "a" then
ngx.exec("/forbid1")
elseif vala == "b" then
ngx.exec("/forbid2")
elseif vala == "c" then
ngx.exec("/forbid3")
else
ngx.exec(404)
end
';
limit_req2 zone=three forbid_action=@banip3 nodelay;
limit_req2 zone=two forbid_action=@banip2 nodelay;
limit_req2 zone=one forbid_action=@banip1 nodelay;
}
}
5、重启nginx
pkill nginx; nginx
若无意外,就大功告成了
未做过大量测试,出错请提供错误信息或自己排查错误
从hostloc来的,,,这个能防cc???本人已按照上文操作,还没测试。。
不能防。
亲,已经安装了nginx 要怎么添加这些东西 = =
对照自己的nginx -V修改
求付费帮忙安装.