nginx

redis+lua+nginx防刷

作者:admin 2019-04-06 我要评论( )

对于用户进行恶意的攻击,可以用lua+redis结合将用户进行频繁的访问拦截在nginx处理,防止大量的同一个用户的请求都请求到上游服务器

一 思路

    用户对服务器访问时,在location处,采用nginx模块nginx_lua_module处理,当然你也可以安装openrestry。

至于nginx_lua_module的安装,可以参考网上的方法。


二 流程图 

    image.png


三 代码


    

    location / {

                 access_by_lua_file "/usr/local/nginx/conf/lua/blackIp.lua";

                 try_files $uri $uri/ /index.php?$query_string;

       }


    blackIp.lua 代码如下:

   

    local function getClientIp()    
        local ip = ngx.req.get_headers()['X_Real_IP']
    if ip == nil then
       ip  = ngx.var.remote_addr
    end
    return ip   
    end
    
    local redis = require "redis"
    local red = redis:new()
    local ok, err = red:connect("127.0.0.1", 9736) 
    if not ok then
        ngx_log(ngx_ERR, "redis connect error", err)
    end
    
    --get clint ip
    local req_ip = getClientIp()
    
    local key_1min = req_ip.."_1min"
    
    -- 1秒不能访问2次
    local res,err8 = red:eval("local res, err1 = redis.call('INCR',KEYS[1]) if res == 1 then local resexpire,err2 = redis.call('EXPIRE', KEYS[1], KEYS[2])  end return res",2, key_1min, 1) 
    
    if res > 2 then
        local top_ip = "top_access_ip"
        red:eval("redis.call('SADD', KEYS[1], KEYS[2])", 2 , top_ip, req_ip)
        ngx.exec("/error")
    end


}

转载请注明出处。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • nginx安装geoip模块

    2019-05-11

  • Lvs Dr模式原理及配置

    2018-03-07

  • Nginx配置文件中location与rewrite执行的顺序

    2017-08-30