nginx代理Google An­a­lyt­ics

/ 0评 / 0

gg
Google An­a­lyt­ics 是谷歌提供的数据统计服务,可以对目标网站进行访问数据统计和分析,并提供多种参数供网站拥有者使用。

网站配置GA的常见方式是在网络前端引用analysis.js脚本,从前端利用javascript进行统计,这种方案的缺点是:

1、客户端到GA的网络问题,analysis.js加载缓慢,向GA发送信息速度慢或者失败,各地网络情况不一导致失败等问题。

2、客户端屏蔽GA,比如一些插件adblock扩展自带的屏蔽列表,利用userscript进行屏蔽等方式,这些会导致统计存在偏差等问题

所以,我们将GA的统计工作从前端转到后端完成,就可以避免上述问题。也就是使用nginx做一个代理,将用户的请求操作替换成本机来请求的操作,这样就解决了网络不一的问题,速度慢或失败的问题,并且是不影响客户端的体验,统计的数据更加准确。

nginx配置

[root@sandy]# cd /usr/local/nginx/conf
conf/
├── vhost
│   ├── blog.e9china.net.conf
├── nginx.conf

看下目录结构,这里我们启用了Include。

在主配置文件nginx.conf中http{ }段里加上map { }

map $http_user_agent $limit_bots {
  default 0;
  ~*(google|bing|yandex|msnbot) 1;
  ~*(AltaVista|Slurp|BlackWidow|Bot|ChinaClaw|Custo|DISCo|Download|Demon|eCatch|EirGrabber|EmailSiphon|Emailwolf|SuperHTTP|Surfbot|WebWhacker) 1;
  ~*(Express|WebPictures|ExtractorPro|EyeNetIE|FlashGet|GetRight|GetWeb!|Go!Zilla|Go-Ahead-Got-It|GrabNet|Grafula|HMView|Go!Zilla|Go-Ahead-Got-It) 1;
  ~*(rafula|HMView|HTTrack|Stripper|Sucker|Indy|InterGET|Ninja|JetCar|Spider|larbin|LeechFTP|Downloader|tool|Navroad|NearSite|NetAnts|tAkeOut|WWWOFFLE) 1;
  ~*(GrabNet|NetSpider|Vampire|NetZIP|Octopus|Offline|PageGrabber|Foto|pavuk|pcBrowser|RealDownload|ReGet|SiteSnagger|SmartDownload|SuperBot|WebSpider) 1;
  ~*(Teleport|VoidEYE|Collector|WebAuto|WebCopier|WebFetch|WebGo|WebLeacher|WebReaper|WebSauger|eXtractor|Quester|WebStripper|WebZIP|Wget|Widow|Zeus) 1;
  ~*(Twengabot|htmlparser|libwww|Python|perl|urllib|scan|Curl|email|PycURL|Pyth|PyQ|WebCollector|WebCopy|webcraw) 1;
  ~*(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) 1;
}

在子配置文件blog.e9china.net.conf里加上:

  #启用userid会通过cookie给每一个访客一个固定的userid
  userid on;
  #因为GA内的userid叫cid所以这里命名为cid
  userid_name cid;
  #相当于cookie的域,设置裸域则同一个用户访问二级域名会识别成一个用户,反之识别为不同的用户
  userid_domain blog.e9china.net;
  #相当于cookie的path,设置为根目录就好
  userid_path /home/wwwroot/blog.e9china.net;
  #相当于cookie的过期时间,设置为最大,尽可能的长期追踪一个用户的访问记录
  userid_expires max;
  rewrite   ^(.*) https://$host$1 permanent;

  location @tracker {
    #只允许内部访问
    internal;
    resolver 8.8.8.8 8.8.4.4 ipv6=off;
    proxy_method GET;
    #$uid_set$uid_got当用户是第一次访问时,$uid_set为cid=xxxxx,$uid_god为空,以后访问时两者相反,所以$uid_set$uid_got实际上会得到cid=xxxxx
    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_pass https://127.0.0.1:9999/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;
    #不向GA提交原请求的body
    proxy_pass_request_body off;
  }

  location / {
    try_files $uri $uri/ =404;
    #当匹配到此location时,这里会异步调用@tracker
    post_action @tracker;
  }

配置无误检查正确后重启下服务即可。

另外我们还要修改我们的前端代码,以wordpress为例,这里我是在header.php中添加的GA代码:

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-137679245-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'UA-137679245-1');
</script>

至此,使用nginx代理GA就已完成。

发表评论

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