Google Analytics的Nginx解决方案

众所周知,Google Analytics虽然很强大,但是同时存在许多问题。

1. 某国境内加载很慢。
2. 用户浏览器设置的AdBlock或其他屏蔽工具可能会阻止GA脚本的加载,从而导致数据的不准确。

对于这些问题有一些解决方法。

1. 使用Google Analytics的替代品。国内Baidu analytics显然是拒绝的。国外有一些替代品,如Open Web Analytics是一个开源解决方案,但是这就不在本文讨论范围之内了。

2. 使用Nginx来解决这个问题。但是,使用Nginx的解决方案也分几种。第一种,纯粹是把Nginx作为一个通用的反向代理工具,代理analytics.js脚本。这样客户端浏览器依然需要加载analytics.js脚本,只是不再需要考虑客户端浏览器到Google服务器的连接问题,因为客户端浏览器获得的analytics.js脚本是从服务器端的Nginx反代得到的。这种方案能够解决analytics.js在糟糕网络环境下的加载问题,但是如果客户端浏览器有设置一些屏蔽规则,analytics.js的作用还是无法显现的。

使用Nginx的第二种解决方案,客户端浏览器不必再加载analytics.js脚本,利用Nginx自身的模块加上调用Google的API即可完成上传统计数据到GA的功能。一个简单的示例Nginx配置文件如下

简单解释,userid模块将会在用户访问时检查 cook­ies 中是否有 cid 项,如果没有 cid 项,则会在返回的 header 中加入 set-cookies 头标记这个用户,并将 $uid_set 变量设定为 cid=XXXXXX 这一形式,将 $uid_got 变量设定为空。如果有 cid 项,则将 $uid_got 变量设定为 cid=XXXXXX 这一形式,将 $uid_set 变量设定为空。于是在 @tracker 部分,上述变量会将 $uid_set$uid_got 填充为cid=XXXXXX。
实际向 Google An­a­lyt­ics 提交数据时:
1. tid为跟踪 ID,即类似 UA-123456-1 的用于区别是要向哪个 Google An­a­lyt­ics(分析)媒体资源发送数据的参数,可以从 Google An­a­lyt­ics 获得;
2. cid即客户端 ID,以 cook­ies 的形式用于区分和追踪用户,这里通过 userid 模块完成;
3. t、dh、dp参数用于标记事件类型,访问的网站与访问的路径;
4. uip参数即用户的 IP 地址,用于追踪用户所处地区等信息;
5. dr参数即用户的 ref­erer,用于追踪用户的来源信息;
6. ul参数即用户的语言,通过 Map 操作从 Accept-Language 中提取;
7. z参数没有实际意义,仅仅用于附加一个时间戳以防止向 Google An­a­lyt­ics 提交数据时,这个请求被缓存。

在Nginx端配置完成后,可向GA服务器发送测试流量。可事先用curl测试proxy_pass中的URL是否正确。记得将UA-XXXXXXXX-Y换成自己网站的ID。

参考:https://darknode.in/network/nginx-google-analytics/
通过Nginx设置analytics.js反代的参考:https://ruby-china.org/topics/27400

发表评论

电子邮件地址不会被公开。 必填项已用*标注