zoukankan      html  css  js  c++  java
  • 网站流量数据采集环境部署及实现(埋点)

    一、原理分析与设计实现

      

        友情链接:https://www.cnblogs.com/likemebee/p/7967534.html

    二、系统环境部署

        !!!执行复制下列命令是注意查看是否为英文类型的 “-” ,当命令错误时首先排查该处

    -------------------------------服务器  A  中部署开始-----------------------------------

      需要的安装包

    uaJIT-2.0.4.tar.gz
    set-misc-nginx-module-0.29.tar.gz
    lua-nginx-module-0.10.0.tar.gz
    ngx_devel_kit-0.2.19.tar.gz
    echo-nginx-module-0.58.tar.gz
    openresty-1.9.7.3.tar.gz
    nginx-1.8.1.tar.gz
    • 服务器中安装依赖
    yum -y install gcc perl pcre-devel openssl openssl-devel
    • 上传 LuaJIT-2.0.4.tar.gz 并安装 LuaJIT
    tar -zxvf LuaJIT-2.0.4.tar.gz -C /usr/local/src/
    cd /usr/local/src/LuaJIT-2.0.4/
    make && make install PREFIX=/usr/local/luajit
    • 设置 LuaJIT 环境变量
    vi /etc/profile
    export LUAJIT_LIB=/usr/local/luajit/lib
    export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0
    source /etc/profile
    • 创建 modules 文件夹,保存 nginx 依赖的模块
    mkdir -p /usr/local/nginx/modules
    • 上传 nginx 依赖的模块
    set-misc-nginx-module-0.29.tar.gz
    lua-nginx-module-0.10.0.tar.gz
    ngx_devel_kit-0.2.19.tar.gz
    echo-nginx-module-0.58.tar.gz
    • 将依赖的模块直接解压到 modules 目录
    tar -zxvf lua-nginx-module-0.10.0.tar.gz -C /usr/local/nginx/modules/
    tar -zxvf set-misc-nginx-module-0.29.tar.gz -C /usr/local/nginx/modules/
    tar -zxvf ngx_devel_kit-0.2.19.tar.gz -C /usr/local/nginx/modules/
    tar -zxvf echo-nginx-module-0.58.tar.gz -C /usr/local/nginx/modules/
    • 安装 openresty
    tar -zxvf openresty-1.9.7.3.tar.gz -C /usr/local/src/
    cd /usr/local/src/openresty-1.9.7.3/
    ./configure --prefix=/usr/local/openresty --with-luajit && make && make install
    • 安装 nginx
    tar -zxvf nginx-1.8.1.tar.gz -C /usr/local/src/
    • 编译 nginx 并支持其他模块
    cd /usr/local/src/nginx-1.8.1/
    #解压过后修改src/http/modules/ngx_http_log_module.c文件可以解决获取的中文乱码问题
    ./configure --prefix=/usr/local/nginx 
    --with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib" 
    --add-module=/usr/local/nginx/modules/ngx_devel_kit-0.2.19 
    --add-module=/usr/local/nginx/modules/lua-nginx-module-0.10.0 
    --add-module=/usr/local/nginx/modules/set-misc-nginx-module-0.29 
    --add-module=/usr/local/nginx/modules/echo-nginx-module-0.58
    make -j2
    make install

    备注:如果对 linux 相关操作不熟,请严格按照上述步骤搭建环境,切记心细,心细,再心细。

    -------------------------------服务器  A  中部署结束-----------------------------------

    三、自定义采集数据实现

    -------------------------------服务器  B  中执行开始-----------------------------------

    • 安装httpd
    yum install httpd
    • 启动httpd
    service httpd start
    • 进入/var/www/html/内上传 index.html页面文件
    cd /var/www/html/
    • 创建页面 index.html

      页面 index.html代码如下:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>welcome</title>    
        
            <script type="text/javascript">
            var _maq = _maq || [];
            _maq.push(['_setAccount', 'jiFeng']);
         
            (function() {
                var ma = document.createElement('script'); 
                ma.type = 'text/javascript';
                ma.async = true;
                ma.src = 'http://192.168.175.153/ma.js';
                var s = document.getElementsByTagName('script')[0]; 
                s.parentNode.insertBefore(ma, s);
            })();
            </script>
                            
        </head>
        <body>
            <h1 align="center">云计算大数据</h1>    
        </body>
    </html>

    -------------------------------服务器  B  中执行结束-----------------------------------

    -------------------------------服务器   A  中执行开始-----------------------------------

    •  在安装目录 nginx/html 下添加一个数据采集脚本 ma.js。
    cd /usr/local/nginx/html/

          脚本 ma.js代码如下:

    (function () {
        var params = {};
        //Document对象数据
        if(document) {
            params.domain = document.domain || ''; 
            params.url = document.URL || ''; 
            params.title = document.title || ''; 
            params.referrer = document.referrer || ''; 
        }   
        //Window对象数据
        if(window && window.screen) {
            params.sh = window.screen.height || 0;
            params.sw = window.screen.width || 0;
            params.cd = window.screen.colorDepth || 0;
        }   
        //navigator对象数据
        if(navigator) {
            params.lang = navigator.language || ''; 
        }   
        //解析_maq配置
        if(_maq) {
            for(var i in _maq) {
                switch(_maq[i][0]) {
                    case '_setAccount':
                        params.account = _maq[i][1];
                        break;
                    default:
                        break;
                }   
            }   
        }   
        //拼接参数串
        var args = ''; 
        for(var i in params) {
            if(args != '') {
                args += '&';
            }   
            args += i + '=' + encodeURIComponent(params[i]);
        }   
     
        //通过Image对象请求后端脚本
        var img = new Image(1, 1); 
        img.src = 'http://192.168.175.153/log.gif?' + args;
    })();
    •  修改 nginx 的配置文件,添加自定义相关业务逻辑。
    cd /usr/local/nginx/conf
    vi nginx.conf 
    worker_processes  2;
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
                          
        log_format user_log_format "$msec||$remote_addr||$status||$body_bytes_sent||$u_domain||$u_url||$u_title||$u_referrer||$u_sh||$u_sw||$u_cd||$u_lang||$http_user_agent||$u_account";
        
        sendfile        on;  #允许sendfile方式传输文件,默认为off
    
        keepalive_timeout  65; #连接超时时间,默认为75s
    
        server {
            listen       80;
            server_name  localhost;
            location /log.gif {
                #伪装成gif文件
                default_type image/gif;    
                #nginx本身记录的access_log,日志格式为main
                access_log  logs/access.log  main;
            
                access_by_lua "
                    -- 用户跟踪cookie名为__utrace
                    local uid = ngx.var.cookie___utrace        
                    if not uid then
                        -- 如果没有则生成一个跟踪cookie,算法为md5(时间戳+IP+客户端信息)
                        uid = ngx.md5(ngx.now() .. ngx.var.remote_addr .. ngx.var.http_user_agent)
                    end 
                    ngx.header['Set-Cookie'] = {'__utrace=' .. uid .. '; path=/'}
                    if ngx.var.arg_domain then
                    -- 通过subrequest到/i-log记录日志,将参数和用户跟踪cookie带过去
                        ngx.location.capture('/i-log?' .. ngx.var.args .. '&utrace=' .. uid)
                    end 
                ";  
            
                #此请求资源本地不缓存
                add_header Expires "Fri, 01 Jan 1980 00:00:00 GMT";
                add_header Pragma "no-cache";
                add_header Cache-Control "no-cache, max-age=0, must-revalidate";
            
                #返回一个1×1的空gif图片
                empty_gif;
            }   
        
            location /i-log {
                #内部location,不允许外部直接访问
                internal;
            
                #设置变量,注意需要unescape
                set_unescape_uri $u_domain $arg_domain;
                set_unescape_uri $u_url $arg_url;
                set_unescape_uri $u_title $arg_title;
                set_unescape_uri $u_referrer $arg_referrer;
                set_unescape_uri $u_sh $arg_sh;
                set_unescape_uri $u_sw $arg_sw;
                set_unescape_uri $u_cd $arg_cd;
                set_unescape_uri $u_lang $arg_lang;
                set_unescape_uri $u_account $arg_account;
            
                #打开subrequest(子请求)日志
                log_subrequest on;
                #自定义采集的日志,记录数据到user_defined.log
                access_log logs/user_defined.log user_log_format;
            
                #输出空字符串
                echo '';
            }        
        }
    }
    •  启动 nginx
    cd /usr/local/nginx
    sbin/nginx -c conf/nginx.conf
    •  查看是否启动
    ps -ef | grep nginx

      

    -------------------------------服务器   A  中执行结束-----------------------------------

    •  通过游览器访问 nginx
    访问:192.168.175.151/index.html

     -------------------------------服务器   A  中执行开始-----------------------------------

    • 观察自定义日志采集文件是否有对应的内容输出:
    cd /usr/local/nginx/logs
    tail -f user_defined.log

     

    此时还可以观察 nginx 默认的输出日志文件:

    tail -f access.log

    停止 nginx: 

    cd /usr/local/nginx
     sbin/nginx –s stop

    -------------------------------服务器   A  中执行结束-----------------------------------

  • 相关阅读:
    素数
    超级素数
    SUMMARIZE 6.1
    广度优先搜索与八字码问题
    poj2352
    poj1198
    康托展开
    STL里的内存池实现
    构造函数,C++内存管理,内存泄漏定位
    内联函数,宏定义,内存对齐,类型转换
  • 原文地址:https://www.cnblogs.com/jifengblog/p/9264706.html
Copyright © 2011-2022 走看看