Hugh's Blog

Nginx + Google Analytics 配置

网站添加 Google Analytics 一般是在页面中添加 Tracking Code,而加载进来的 analytics.js 脚本有 11 KB 的大小,如今我每个页面的大小大概是 5 KB 左右,相对来说有点大了,另外还有一些问题,比如在大陆要加载分析脚本很慢,而且容易给一些插件给屏蔽掉等,无意中找到一篇文章说可以利用 Nginx 来做转发,详情看 Nginx 内配置 Google Analytics 指南

另外我又找了一些文章 (本博客零散优化点汇总),作者也是利用服务端来进行转发的 (这个博客真的好快)。

大概总结一下,实现方式可以分为两种

  1. 服务端对每次请求进行转发
  2. 服务端与客户端结合进行转发,首先在浏览器对每次访问添加统计请求 (可以自定义统计数据),再由服务端进行转发

这两种方式虽然都是由 Nginx 作转发,但还是有一点点不同,第一种获取不了浏览器的一些信息,比如屏幕尺寸,文档标题等等,而第二种则依赖于 JavaScript,如果浏览器禁用了 JavaScript 的话,就不会发送统计请求了,本文使用的是第二种,关于第一种可以参考这篇文章:使用Nginx将请求转发至Google Analytics实现后端统计,里面写得很详细。

客户端

请求地址是 g.html,代码段摘自 JerryQu 的小站

;!function(a,b,c){var d=a.screen,e=encodeURIComponent,f=["dt="+e(b.title),"dr="+e(b.referrer),"ul="+(c.language||c.browserLanguage),"sd="+d.colorDepth+"-bit","sr="+d.width+"x"+d.height],g="?"+f.join("&");a.__ga_img=new Image,a.__ga_img.src="/g.html"+g}(window,document,navigator,location);

服务端

有几点需要注意

  • map 指令要写在 server 外,即 http 块中 (nginx.conf)
  • 使用 ngx_http_userid_module 生成唯一用户 ID
  • g.html 要禁止缓存,这样在点击后退的时候就能实时统计了 (也可以在后面追加一个时间戳参数来刷新,例如 &_=new Date)
  • 有时候转发地址会使用 ipv6,可以在 resolver 中关掉

2017-06-12

使用 valid_referers 代替正则。

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

location @tracker {
    internal;
    resolver 8.8.8.8 8.8.4.4 ipv6=off;
    proxy_method GET;
    proxy_pass https://www.google-analytics.com/collect?v=1&tid=UA-xxxxxxxx-1&$uid_set$uid_got&t=pageview&je=0&uip=$remote_addr&dl=$http_referer&$args&z=$msec;
    proxy_set_header User-Agent $http_user_agent;
    proxy_pass_request_headers off;
    proxy_pass_request_body off;
}

location ~ /g.html {
    valid_referers server_names *.imhugh.com;
    if ($invalid_referer) {
        return 444;
    }
    post_action     @tracker;
    add_header      Cache-Control "no-store, must-revalidate, max-age=0";
    add_header      Expires "Mon, 26 Jul 1997 05:00:00 GMT";
    add_header      Pragma no-cache;
    return 204;
}

参考

本博客零散优化点汇总

Create GUID / UUID in JavaScript?

Blocking all bots except a few with Nginx

Nginx 内配置 Google Analytics 指南

使用Nginx将请求转发至Google Analytics实现后端统计

Measurement Protocol 参考

Nginx 做代理,如何实现先立即返回空内容并结束请求…