就是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

若无意外,就大功告成了

 

未做过大量测试,出错请提供错误信息或自己排查错误

   

已有 5 條評論

  1. hcw1588 13 年前 (2013-05-06)
    @

    从hostloc来的,,,这个能防cc???本人已按照上文操作,还没测试。。

  2. 唯恐不屈 13 年前 (2013-04-12)
    @

    亲,已经安装了nginx 要怎么添加这些东西 = =

    • 飛天鼠 13 年前 (2013-04-12)
      @

      对照自己的nginx -V修改

  3. 丶花落若相惜 13 年前 (2013-01-16)
    @

    求付费帮忙安装.