通过Nginx统计网站的PV、UV、IP
概念
UV:独立访客;以cookie为依据,假设一台电脑装有3个不同的浏览器,分别打开同一个页面,将会产生3个UV。
PV:访问量;页面每访问或刷新一次,将会产生一个PV。
IP:独立IP地址;以公网IP为依据,每个独立IP访问该页面,将会产生一个IP。
nginx配置
在vhost的conf文件中配置以下信息,请将此conf文件的权限设为777,否则无法自动生成日志文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #日志格式化 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"
日志分析
命令:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?