Google Analytics 对于站长来说,是一个非常好用的工具,它能对网站流量做非常详细的分析。但随着 AdBlock 越来越流行,我们在 Google Analytics 上能看到的数据越来越少。但用户的确是访问了我们的网站,访问记录都在 Nginx 日志里。我们有办法将 Nginx 日志发送给 Google Analytics 来完善数据统计吗?当然是可以的!我们不仅能用 Google Analytics 来分析访问用户,还可以用来分析网站静态资源的访问情况,甚至是 api 的调用情况。下图就是我将自己一个网站的 Nginx 日志发送给 Google Analytics 之后在 Google Analytics 上看到的统计信息。
Realtime
我就以 https://blog.chenyuanwai.com 这个网站为例,完整演示一遍过程,整个部署过程不超过 30 分钟。
提前准备
我们需要提前准备两样东西。一个是在服务器上重新安装 Nginx。一个是在 Google Analytics 里添加一个网站。
Nginx
我用的服务器是 Ubuntu 16.04.3,其他 linux 的发行版安装 Nginx 的过程类似。首先我们要先把我们在用的 Nginx 停掉,然后安装我们用到的新的 Nginx。确保以下命令使用 root 用户执行。
# 停掉 Nginxservice nginx stop# 安装 Nginxapt -yinstall --no-install-recommends wget gnupg ca-certificateswget -O - https://openresty.org/package/pubkey.gpg | apt-key add -echo"deb http://openresty.org/package/ubuntu $(lsb_release -sc) main"| tee /etc/apt/sources.list.d/openresty.listapt update# nginx 会安装在 /usr/local/openresty/nginxapt -yinstall openresty
到这里我们就安装好了 Nginx。因为 Nginx 的安装目录变了,我们要对新的 Nginx 配置文件做一些修改。打开 /usr/local/openresty/nginx/conf/nginx.conf 文件,在 http 配置下面引用之前的网站配置文件,修改后的 nginx.conf 大概是下面这个样子,我删掉了其中的注释。注意,你可能需要根据自己的实际情况对新的 nginx.conf 做修改。
worker_processes 1;
events {
worker_connections 1024;}http { include mime.types;
default_type application/octet-stream; sendfile on; keepalive_timeout 65; server {
listen 80;
server_name localhost; location / {
root html;
index index.html index.htm;
} error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
} # 新加的这样 include 配置,把之前的网站配置文件加载进来
include /etc/nginx/conf.d/*;
}
在 Google Analytics 里添加一个网站
在 Google Analytics 里添加 property 时,默认是添加一个 Google Analytics 4 property。我们需要的是一个 Universal Analytics property。所以在添加 property 页面点击 show advanced options,在里面选择 Create a Universal Analytics property,如下图所示
Universal Analytics property
创建好之后,你就能看类似 UA-181920284-1 的 tracking id,这个 tracking id 就是我们用来给 Google Analytics 发送数据时要使用的参数。
给 Google Analytics 发送数据
Nginx 和 Google Analytics 准备好之后,我们就要开始让 Nginx 给 Google Analytics 发送数据了。我们用 opm 先安装一个库。opm 是 Nginx 的包管理工具,类似 python 的 pip。
opm get BeanYoung/lua-resty-gaopm get thibaultcha/lua-resty-jit-uuidwgethttps://raw.githubusercontent.com/cloudflare/lua-resty-cookie/master/lib/resty/cookie.lua -O /usr/local/openresty/site/lualib/resty/cookie.lua
安装好之后,我们修改网站的 Nginx 配置文件。修改前的配置文件大概是这样的:
server {server_name blog.chenyuanwai.com;listen443;ssl on;ssl_certificate /etc/nginx/ssl/blog.chenyuanwai.com.cert;ssl_certificate_key /etc/nginx/ssl/blog.chenyuanwai.com.key;location / {proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header Host $http_host;proxy_redirect off;proxy_pass http://127.0.0.1:8081;}access_log /var/log/nginx/blog-access.log;error_log /var/log/nginx/blog-error.log;}
修改后的配置大概是这样的
# 这一部分是给 Google Analytics 发送请求要用到的resolver223.5.5.5valid=3600s ipv6=off;lua_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;# 这里是日志的缓存,我们每秒把缓存里的请求批量发送给 Google Analyticslua_shared_dict ga_cache128m;init_by_lua_block {localprocess =require'ngx.process'process.enable_privileged_agent()}init_worker_by_lua_block {localprocess =require'ngx.process'localga =require'resty.ga'localuuid =require'resty.jit-uuid'uuid.seed()ifprocess.type() =='privileged agent'thenngx.timer.every(1, ga.send)end}server { server_name blog.chenyuanwai.com; listen443; ssl on; ssl_certificate /etc/nginx/ssl/blog.chenyuanwai.com.cert; ssl_certificate_key /etc/nginx/ssl/blog.chenyuanwai.com.key; access_log /var/log/nginx/blog-access.log; error_log /var/log/nginx/blog-error.log; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://127.0.0.1:8081; # 根据自己的业务来设置用户 cid。这里只是在 cookie 里记录了一个 _cid 的字段 access_by_lua_block {localcookie =require'resty.cookie'localuuid =require'resty.jit-uuid'localck = cookie:new()localcid = ck:get("_cid")ifnotcidthencid = uuid()endck:set({key ='_cid', value = cid}) ngx.ctx.cid = cid } # 每个请求结束后,把当前请求的日志存到缓存里 log_by_lua_block {localga =require'resty.ga'-- 将自己的 tracking id 填在这里localtid ='UA-181920284-1'localcid = ngx.ctx.cidlocaluip = ngx.var.remote_addr-- 如果你的网站是放在 cloudflare 后面的,这里把 uip 换成 cloudflare 传的用户 iplocalheaders = ngx.req.get_headers()ifheaders['CF-Connecting-IP']thenuip = headers['CF-Connecting-IP']endga.collect(tid, cid, uip) } }}
配置好了之后,我们重启 Nginx
service openresty restart
大功告成。这时,如果刷新一下网站,很快就能在 Google Analytics 里看到实时的数据了。
Realtime
还可以做什么
其实这是一个很好地开始,在这个基础上,我们还做更多有意思的事情。比如我们可以把 API 服务器的 Nginx 日志发送给 Google Analytics,就可以在 Google Analytics 里看到所有的 API 调用统计。我们也可以用 lua-resty-ga 这个库把每个 http 请求的状态、响应大小、是否命中缓存等指标发送给 Google Analytics,用 Google Analytics 里的自定义统计来把这些数据展示出来。
如果你觉得这篇文章有帮到你,欢迎给我写的 lua-resty-ga 这个库一个⭐️。
。