就是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(参考)
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 |
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
1 2 3 4 5 6 7 8 |
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)
1 2 3 4 5 6 7 |
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段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
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
1 |
pkill nginx; nginx |
若无意外,就大功告成了
未做过大量测试,出错请提供错误信息或自己排查错误
从hostloc来的,,,这个能防cc???本人已按照上文操作,还没测试。。
不能防。
亲,已经安装了nginx 要怎么添加这些东西 = =
对照自己的nginx -V修改
求付费帮忙安装.