根据Nginx日志统计过UV和PV

网站已经在阿里云上部署了一段时间了,但还没有统计UV,PV等方面信息。 由于网站访问量不大,日志文件也不大,所以暂时直接用脚本分析就满足了,等日后网站访问量很大(估计不知道是啥时候,哈哈)就用Dpark来统计。

看了很多资料,学到很多,但有很多介绍得不详细,且错误很多。今天刚把它写好,就记录下来。

学完之后觉得awk很强大,下面这几项都是用awk命令实现的。

我的日志格式:

    log_format access_with_cookie  '$remote_addr - $remote_user [$time_local] "$request" '
           '$status $body_bytes_sent "$http_referer" '
           '"User_Cookie:$csrftoken" "$http_user_agent" "$http_cookie"';

1、IP

IP是最好统计的了,不用其他附加条件,只要统计每一个单独IP出现的个数。

#!/bin/bash

DATE=$(date -d yesterday +"%Y-%m-%d")

NGINX_ACCESS_LOG="/mnt/backup/nginx/$DATE_nginx_access.log
NGINX_ERROR_LOG="/mnt/backup/nginx/$DATE_nginx_error.log


#stat daily ip
awk '{print $1}' $NGINX_ACCESS_LOG | sort -r |uniq -c | wc -l > /mnt/logs/$DATE_ip.log

2.UV

这个是最需要注意的。网上有很多直接就统计IP数目就为UV。这其实犯了一个很严重的错误。因为有些用户是共用一个公网IP的。比如,一家企业公司,可能只有一个或者两个公网IP,内部员工最后的出口IP可能都相同。如果你统计IP,就出现了很严重的错误。

在Django中,我们为了避免CSRF,在cookie中设置了csrftoken,此外对于登录用户,设置了sessionid,不过这只针对登录用户,因此我们用csrftoken即可。

首先要配置nginx,在nginx配置文件中加入:

set $csrftoken "-";

if ($http_cookie ~* ".*csrftoken=([a-z0-9]*)") {
    set $csrftoken $1; 
}

error_log /tmp/nginx/nginx_error.log;
access_log /tmp/nginx/nginx_access.log access_with_cookie;

此外在nginx.conf还要配置log_format格式,我在上面中已经写了,主要有一个字段:

"User_Cookie:$csrftoken"

配置好之后,就可以通过awk命令来统计日UV。 #stat daily UV awk '{print $12}' $NGINX_ACCESS_LOG | sort -r |uniq -c | wc -l > /mnt/logs/$DATE_uv.log

3.PV

PV还是要计算成功返回200状态码的页面。awk可以使用if语句。

#stat daily pv
awk '{if($9==200) print $7}' $NGINX_ACCESS_LOG | wc -l > /mnt/logs/$DATE_pv.log

4.访问量排在前5的页面

#stat top 5 page
awk '{print $7}' $NGINX_ACCESS_LOG |sort|uniq -c|sort -nr|head -n 5 > /mnt/logs/$DATE_top5_pv.log

sort -nr比较重要,n选项是为了按照数字值来排序,省着出现1比10大的情况。

4.访问最频繁的5个IP

#stat top 5 ip
awk '{print $1}' $NGINX_ACCESS_LOG |sort|uniq -c|sort -nr|head -n 5 > /mnt/logs/$DATE_top5_ip.log
--------EOF---------
本文微信分享/扫码阅读