zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Python环境搭建
    接口测试工具Jmeter
    接口测试工具postman
    fiddler -- 一个强大的抓包工具
    Pychram中使用reduce()函数报错:Unresolved reference 'reduce'
    Mac下用命令行获取苹果手机的UDID
    python 的 lambda使用笔记
    appium报错:An unknown server-side error occurred while processing the command. Original error: Could not proxy command to remote server. Original error: Error: read ECONNRESET
    Pycharm中使用from appium import webdriver时报错:ModuleNotFoundError: No module named 'appium'
    如何升级pip3
  • 原文地址:https://www.cnblogs.com/unreal/p/8626524.html
Copyright © 2011-2022 走看看