1. 首页
  2. IT资讯

redis+lua+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

}

本文来自投稿,不代表程序员编程网立场,如若转载,请注明出处:http://www.cxybcw.com/197860.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code