前言

Google Analytics 加载缓慢是本博客在国内访问缓慢的原因之一。虽然通过使用大公司的 ga.js 的 CDN ,可以很大程度上加快加载 ga.js 文件的速度( ga.js 的更新频率很高,并不适合缓存到本地或服务器,所以最好自己反代或者借大公司的光,参见 谷歌分析(Google Analytics) 加速实现秒加载页面 ),但无论如何还是要向 Google 发送一个请求来发送访客数据,所以取巧地使用 CDN 并不能从根本上解决问题。前段时间翻看一个知名博主的文章时,有一篇名为 本博客零散优化点汇总 的文章中写道:「通过服务器端异步发送统计数据的方式来解决这个问题」,这的确是个经济实惠的办法,下面就来实践一下。

思路

  • 方案一:通过 Nginx 的 proxy ,根据 官方给出的文档 向 Google 转发访客数据。
  • 方案二:设立中转服务器,在客户端通过 JS 发送异步请求给中转服务器,由中转服务器将访客信息发送给 Google。

这两种方法都切实可行,不过也都有一个大前提,那就是服务器(中转服务器)必须设置于境外,能够顺畅地访问 Google Analytics ,否则做的也不过是无用功。本文选择较为简单但是定制性不是很强的第一种方案,第二种方案可以参考这篇博文及博主开源的项目:服务端使用 Google Analytics

建立访客 ID

如果我们查看使用 Google Analytics 服务的网站,我们总会在看到一个 _ga 的 cookie 。实际上, ga.js 将此 cookie 中的值做处理后作为本次访问访客的 uid 传回 Google 的服务器,Google Analytics 根据这个 uid 进行访客行为的追踪和新旧访客的统计,这也是官方文档中 cid 参数的作用所在。

因此我们必须针对每一个用户手动生成一个 uid 发送给 Google ,同时也要将这个 uid 保存在客户端的 cookie 中,从而实现在每次访问中,通过判断该 cookie 是否为空来决定是否生成新的 uid 。

本文借助 Nginx 的 userid 模块,便可很轻松的实现这一功能。不过如果想要实现更完善的 uid 生成,还是手写模块或者写 lua 脚本比较好。在 nginx 配置文件中添加如下内容来开启 userid 模块:

    userid on;
userid_name cid;
userid_domain easonyang.com;
userid_path /;
userid_expires max;

建立 tracker location

要想使用 Nginx 发送异步请求,就要活用 nginx 的「 proxy 」和「 location 内部 redirect 匹配」两大功能。这一节内容部分借鉴于 Ng­inx 内配置 Google An­a­lyt­ics 指南 一文。

我们知道「 location 内部 redirect 匹配」的写法是这样的:

location @tracker {
}

所以,我们只要在上面这个 location 块中添加 proxy_pass 就可以了。此处需要注意的是,如果按照上文提到的那篇文章进行配置,我们会发现在大部分情况下转发总是不成功,经过研究,这种情况下必须要加上一个能解析 Google 的 DNS 才可以成功转发。这里直接使用经典的 8.8.8.8 及其 IPV6 地址,最后 location 块为:

location @tracker {
internal;
resolver 8.8.8.8 [2001:4860:4860::8888];
proxy_method GET;
proxy_pass https://www.google-analytics.com/collect?v=1&tid=UA-11111111-1&$uid_set$uid_got&t=pageview&dh=$host&dp=$uri&uip=$remote_addr&dr=$http_referer&z=$msec;
proxy_set_header User-Agent $http_user_agent;
proxy_pass_request_headers off;
proxy_pass_request_body off;
}

使用 tracker location

最后只要在控制网站访问的 location 块中加上 post_action @tracker; 就大功告成了。示例:

    location / {
root /var/www/hexo;
post_action @tracker;
}

然而在实际使用中,我们会发现这样配置使得在 Google Analytics 中看到的网站访问量大大增加,这似乎不像是绕过 Adblock 这样插件而实现的效果。实际上,这是源于在上文的配置中,Nginx 直接把各种搜索引擎蜘蛛也当作普通访客发送给 Google Analytics 的缘故。因此还要将 Spider 过滤掉:

    location / {
root /var/www/hexo;
if ($http_user_agent !~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|YiSou Spider") {
post_action @tracker;
}
}

为 Hexo 配置 tracker location

由于本文使用 Hexo 博客系统,所以此处特别说明一下 Hexo 相关的 Nginx 配置。

配置

在为 Hexo 配置 Nginx 时,我们总习惯于将 location 定义为:

    location / {
root /var/www/hexo/easonyang.com/blog; if (-f $request_filename) {
post_action @tracker;
rewrite ^/(.*)$ /$1 break;
}
}

这样一来我们就要进一步定制 hexo 的 location :

    location / {
root /var/www/hexo; set $flag "0"; if (-f $request_filename) {
set $flag "${flag}1";
} if ($http_user_agent !~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|YiSou Spider") {
set $flag "${flag}2";
} if ($flag = "012") {
post_action @tracker;
rewrite ^/(.*)$ /$1 break;
} if ($flag = "01") {
rewrite ^/(.*)$ /$1 break;
}
}

说明

If is devil.

这是 Nginx 的使用者都知道的至理名言,此处逻辑比较简单,就直接用 if 了。非常不喜欢 if 的话就用 map 代替下吧。

测试

暂时将 proxy_pass https://www.google-analytics.com/collect?v=1&tid=UA-11111111-1&$uid_set$uid_got&t=pageview&dh=$host&dp=$uri&uip=$remote_addr&dr=$http_referer&z=$msec; 修改为 proxy_pass https://127.0.0.1:9999/collect?v=1&tid=UA-11111111-1&$uid_set$uid_got&t=pageview&dh=$host&dp=$uri&uip=$remote_addr&dr=$http_referer&z=$msec; ,然后在服务器上运行命令:

 nc -k -l 0.0.0.0 9999

监听 9999 端口,最后访问网站,就可以在服务器上查看到请求的相应信息。

关于更进一步的请求过滤

虽然我们可以通过设定更加复杂的 Nginx 配置,来实现过滤特定请求进而避免这些无用数据如 404 页面被发往 Google Analytics 的情况发生,但我们完全可以使用更加方便、高效的 Google Analytics 过滤器来满足各种过滤需求,详细配置参见 Google 的官方文档:

博客链接:https://easonyang.com/2016/11/04/google-analytics-via-nginx/

关注公众号「举一得一」获取最新文章更新

使用Nginx将请求转发至Google Analytics实现后端数据统计的更多相关文章

  1. nginx实现请求转发

    反向代理适用于很多场合,负载均衡是最普遍的用法. nginx 作为目前最流行的web服务器之一,可以很方便地实现反向代理. nginx 反向代理官方文档: NGINX REVERSE PROXY 当在 ...

  2. Nginx的简介和使用nginx实现请求转发

    一.什么是Nginx Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作为H ...

  3. Nginx配置请求转发location及rewrite规则

    一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这 ...

  4. nginx得请求转发代码-将请求转发到网关

    首先:本地主机host更改成 192.168.111.1 gulimail.com 这样一访问网址就能映射到本地. 然后修改nginx得conf worker_processes 1; events ...

  5. window10安装nginx及请求转发到tomcat服务器访问项目及开机自启

    一.安装ngnix 1.  到nginx官网上下载相应的安装包,http://nginx.org/en/download.html: 下载进行解压,将解压后的文件放到自己心仪的目录下,我的解压文件放在 ...

  6. nginx实现请求的负载均衡 + keepalived实现nginx的高可用

    前言 使用集群是网站解决高并发.海量数据问题的常用手段.当一台服务器的处理能力.存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求.这种 ...

  7. 【转载】国内网站博客数据统计选免费Google Analytics还是百度统计

    [转载]国内网站博客数据统计选免费Google Analytics还是百度统计 Google Analytics谷歌统计是我用的第一个网站统计工具,当然现在也一直在用.Google Analytics ...

  8. 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器

    现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...

  9. nginx学习(2):启动gzip、虚拟主机、请求转发、负载均衡

    一.启用gzip gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; ...

随机推荐

  1. 摄像头ISP系统原理(下)

    摄像头ISP系统原理(下) l  WDR(Wide Dynamic Range)------宽动态 动态范围(Dynamic Range)是指摄像机支持的最大输出信号和最小输出信号的比值,或者说图像最 ...

  2. 自定义pass编写

    自定义pass编写 TVM是一个框架,抽象了机器学习加速器的异质性.有时,用户可能需要自定义一些分析和IR转​​换,使TVM适应自己的专用硬件.本文可帮助用户在TVM中编写自定义pass. 先决条件 ...

  3. CVPR2020:三维点云无监督表示学习的全局局部双向推理

    CVPR2020:三维点云无监督表示学习的全局局部双向推理 Global-Local Bidirectional Reasoning for Unsupervised Representation L ...

  4. C语言真正的编译过程

    说实话,很多人做了很久的C/C++,也用了很多IDE,但是对于可执行程序的底层生成一片茫然,这无疑是一种悲哀,可以想象到大公司面试正好被问到这样的问题,有多悲催不言而喻,这里正由于换工作的缘故,所以打 ...

  5. springcloud-config配置异常Cannot clone or checkout repository 和 Authentication is required but no CredentialsProvider has been registered解决过程

    Cannot clone or checkout repository, 出现这个异常,通过检查是因为自己本地没有配置 ssh,所以配置了, https://blog.csdn.net/zy_2818 ...

  6. Mysql权限管理以及sql数据备份

    权限管理和备份 用户管理 可视化管理 SQL命令操作 用户表:msql.user 同样就是对表的操作,就是对这张表的增删改查 -- 创建用户 create user kuangshen identfi ...

  7. Linux 安装及管理程序

    Linux 安装及管理程序 目录 一.Linux应用程序基础 1.1.应用程序与系统命令的关系 1.2.典型应用程序的目录结构 1.2.常见的软件包封装类型 二.RPM包管理工具 2.1.RPM软件包 ...

  8. 解放生产力,自动化生成vue组件文档

    一.现状 Vue框架在前端开发中应用广泛,当一个多人开发的Vue项目经过长期维护之后往往会沉淀出很多的公共组件,这个时候经常会出现一个人 开发了一个组件而其他维护者或新接手的人却不知道这个组件是做什么 ...

  9. 使用 TypeScript,React,ANTLR 和 Monaco Editor 创建一个自定义 Web 编辑器(二)

    译文来源 欢迎阅读如何使用 TypeScript, React, ANTLR4, Monaco Editor 创建一个自定义 Web 编辑器系列的第二章节, 在这之前建议您阅读使用 TypeScrip ...

  10. 我是怎么写 Git Commit message 的?

    目录 作用 用的什么规范? type scope subject body footer 参考文章 用的什么辅助工具? 作用 编写格式化的 commit message 能够大大提高代码的维护效率. ...