nginx插入lua脚本访问redis

目标:收集用户日志

流程:

  • 浏览器端get方法将数据传到nginx服务
  • nginx收集到数据,执行内嵌lua脚本,访问redis,根据token获得用户id
  • 将日志信息存入文件

1、nginx安装,参见:http://www.cnblogs.com/unreal/articles/7739290.html

2、安装lua_nginx_module 模块

(略,自行百度)

3、编辑nginx.conf配置文件

[root@master1 conf]# cat /usr/local/nginx/conf/nginx.conf
worker_processes  1;
error_log  logs/error.log;
pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  log_format '$remote_addr^A$msec^A$http_host^A$request_uri';    
    log_format  log_token '$uid_by_token^A$remote_addr^A$msec^A$http_host^A$request_uri';    

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    lua_package_path "/usr/local/nginx/lua/lua-resty-redis/lib/?.lua;;";
    server {
        listen       80;
        server_name  master1 0.0.0.0;

    location /log {
        allow 192.168.8.0/24;
        deny all;
        default_type 'text/html';
        access_log logs/access.log log_format;
        content_by_lua '
                ngx.say("success")
            ';
    }

    location /do {
          #lua_code_cache off;
            set $uid_by_token '';
        default_type 'text/html';
        rewrite_by_lua_file "conf/do.lua";
        access_log logs/access.log log_token;
    }
    }
}

4、编写do.lua文件

[root@master1 ~]# vim /usr/local/nginx/conf/do.lua

--redis ip port pwd
local ip = '192.168.0.8'
local port = 6379
local pwd = "123456"
local key_prefix = "Project:SsoToken:"
------------------

function get_uid(uinfo)
    local uid = '0'
    if uinfo ~= ngx.null then  
        local pos, _ = string.find(uinfo, '"Id":')
        if pos and pos>0 then
            local left = string.sub(uinfo, pos, -1)
        local end_pos, _ = string.find(left, ",")
        local line
        if end_pos and end_pos>0 then
                line = string.sub(left, 1, end_pos)
        else
            end_pos, _ = string.find(left, "}")
            if end_pos and end_pos>0 then
                    line = string.sub(left, 1, end_pos)
        end
        end
        line = string.sub(line, 6, -2)
        uid = string.gsub(line, "^%s*(.-)%s*$", "%1")
        end
    end  
    return uid
end

local function close_redis(redis_instance)
    if not redis_instance then
        return
    end
    local ok,err = redis_instance:close();
end

local token = ngx.var.arg_t
local redis = require("resty.redis");
local redis_instance = redis:new();
redis_instance:set_timeout(2000)
local ok,err = redis_instance:connect(ip,port)
if not ok then
    return close_redis(redis_instance);
end

local auth,err = redis_instance:auth(pwd);
local uinfo, err = redis_instance:get(key_prefix .. token)  
if not uinfo then  
    return close_redis(redis_instance)  
end 
close_redis(redis_instance)

ngx.var.uid_by_token = get_uid(uinfo)
ngx.say('done')

5、测试

浏览器访问输入访问地址:http://master1/do?t=99b61873a98742a3a29a4a6d64bc043f&en=pv&ct=1521163377&ver=1&pl=pc

服务器查看日志:

[root@master1 nginx]# tail -f logs/access.log 
1002^A192.168.8.33^A1521181427.173^Amaster1^A/do?t=99b61873a98742a3a29a4a6d64bc043f&en=pv&ct=1521163377&ver=1&pl=pc
1002^A192.168.8.33^A1521181462.813^Amaster1^A/do?t=99b61873a98742a3a29a4a6d64bc043f&en=pv&ct=1521163378&ver=1&pl=pc
1002^A192.168.8.33^A1521187161.848^Amaster1^A/do?t=99b61873a98742a3a29a4a6d64bc043f&en=pv&ct=1521163378&ver=1&pl=pc