如何在 Google Analytics 里查看 nginx 实时日志

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 这个库一个⭐️。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359

推荐阅读更多精彩内容