zoukankan      html  css  js  c++  java
  • 通过Nginx统计网站的PV、UV、IP

    转载:通过Nginx统计网站的PV、UV、IP

    概念

    UV:独立访客;以cookie为依据,假设一台电脑装有3个不同的浏览器,分别打开同一个页面,将会产生3个UV。
    PV:访问量;页面每访问或刷新一次,将会产生一个PV。
    IP:独立IP地址;以公网IP为依据,每个独立IP访问该页面,将会产生一个IP。

    nginx配置

    在vhost的conf文件中配置以下信息,请将此conf文件的权限设为777,否则无法自动生成日志文件。

    #日志格式化
    log_format tongji '$remote_addr - [$time_iso8601]  "$request" '
                            ' - $status "User_Cookie:$guid" ';
    
    server {
        listen      80;
        server_name xxx.com;
        index index.html index.htm index.php;
        root /alidata/www/tongji;
        #将cookie中key为guid,value为字母、数字部分保存为guid
        if ( $http_cookie ~* "guid=([a-zA-Z0-9]*)"){
            set $guid $1;
        }
        if ($time_iso8601 ~ "(d{4}-d{2}-d{2})") {
            set $date $1;
        }
        #访问日志引用“tongji”的格式化,并按照日期分割保存。
        access_log /alidata/www/nginx_log/access_$date.log tongji;
        location ~* ^(.*)$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size 8m;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    js文件

    在需要统计uv的页面引入以下js文件,生成一个当天过期的cookie。

    var cookie = {
        //当天剩下的毫秒数
        leftTime: function() {
            var curTamp = new Date().getTime();
            //当日凌晨的时间戳,减去一毫秒是为了防止后续得到的时间不会达到00:00:00的状态
            var curWeeHours = new Date(curDate.toLocaleDateString()).getTime() - 1;
            var passedTamp = curTamp - curWeeHours;
            var leftTamp = 24 * 60 * 60 * 1000 - passedTamp;
            return leftTamp;
        },
        //n:键名,v:键值,exp:过期时间(ms)
        setCookie: function(n, v, exp) {
            var date = new Date()
            date.setTime(date.getTime() + exp);
            document.cookie = n + "=" + escape(v) +
                ((exp == null) ? "" : ";expires=" + date.toGMTString())
        },
        //n为想要取到的键值的键名
        getCookie: function(n) {
            var reg = /s/g;
            var result = document.cookie.replace(reg, "");
            var resultArr = result.split(";");
            for (var i = 0; i < resultArr.length; i++) {
                var nameArr = resultArr[i].split("=");
                if (nameArr[0] == n) {
                    return nameArr[1];
                }
            }
        }
    };
    
    //生成随机id
    var guid = function() {
        function S4() {
            return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
        }
        return (S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4());
    };
    //如果guid不存在,则生成guid
    console.log(cookie.leftTime() / 1000 / 60);
    !cookie.getCookie('guid') && cookie.setCookie('guid', guid(), cookie.leftTime());
    document.write(document.cookie);

    日志文件

    内容如下:

    61.141.xxx.xxx - [2019-05-16T15:18:34+08:00]  "GET /ttt.html HTTP/1.1"  - 304 "User_Cookie:032284f362a63e3d375f8176aad4e0d7" 
    61.141.xxx.xxx - [2019-05-16T15:18:35+08:00]  "GET /ttt.html HTTP/1.1"  - 304 "User_Cookie:032284f362a63e3d375f8176aad4e0d7" 
    61.141.xxx.xxx - [2019-05-16T15:18:35+08:00]  "GET /ttt.html HTTP/1.1"  - 304 "User_Cookie:032284f362a63e3d375f8176aad4e0d7" 
    61.141.xxx.xxx - [2019-05-16T15:18:35+08:00]  "GET /ttt.html HTTP/1.1"  - 304 "User_Cookie:032284f362a63e3d375f8176aad4e0d7" 
    61.141.xxx.xxx - [2019-05-16T15:18:35+08:00]  "GET /ttt.html HTTP/1.1"  - 304 "User_Cookie:032284f362a63e3d375f8176aad4e0d7" 
    61.141.xxx.xxx - [2019-05-16T15:18:35+08:00]  "GET /ttt.html HTTP/1.1"  - 304 "User_Cookie:032284f362a63e3d375f8176aad4e0d7" 

    日志分析

    命令:

    //统计IP
    awk '{print $1}' xxx/access.log(你的日志文件路径) | sort -r |uniq -c | wc -l
    //统计PV
    awk '{print $6}' xxx/access.log(你的日志文件路径) | wc -l
    //统计UV
    awk '{print $10}' xxx/access.log(你的日志文件路径) | sort -r |uniq -c |wc -l
    
    
  • 相关阅读:
    Flutter——限制按钮点击的时间间隔
    【友盟】添加埋点事件(以iOS和安卓端为例)
    Git——在VSCode中查看Git历史提交记录
    Flutter——【好用网站】大集合
    Flutter——数组(List)
    Flutter——实现强大的输入框功能
    基于腾讯位置服务定位实现物业巡检防作弊场景
    基于腾讯地图定位组件实现周边公用厕所远近排序分布图
    腾讯位置服务Flutter业务实践——地图SDK Flutter插件实现(一)
    微信小程序类快递自动填写收发货地址功能
  • 原文地址:https://www.cnblogs.com/-wenli/p/11715843.html
Copyright © 2011-2022 走看看