Skip to main content

Matomo - 为你的服务器增加强大的访客分析功能

· 8 min read

你是否对自己网站的访问情况感兴趣,你是否厌倦于第三方提供的访客分析功能?一起来试试matomo(piwik)吧。

注意:下文内容都是我配置nginx log to matomo得到经验,或许和你的需求不太一样 注意:下文要求你要统计的服务和Matomo安装在同一台机器上,如果不是这种情况你也可以参考一下

什么是 Matomo

Matomo - a powerful web analytics platform that gives you and your business 100% data ownership and user privacy protection.

官方宣传得很直接,对标google analytics的私有访客分析工具,对于我们这种个人用户来说是绝对够用了。我起初认为个人使用Matomo就是用自己vps的性能换取隐私,但导入服务器日志的功能吸引了我。

通过导入服务器日志获取访客数据

使用过访客分析工具的人一定知道,访客分析一般是需要我们在网站页面内插入一段javascript代码的。诚然这是一个获取的访客数据最全面的方法,但插入javascript代码并不总是让人愉悦的,在一些无法控制页面内容的服务上也无法使用。这时我们需要的就是服务器软件的访问日志。 任何一款常见的服务器软件都会有完整的日志功能,而Matomo也对常见的服务器软件的日志格式做了兼容处理,这使我们使用起来简单了许多。访客数据的传输路径就像这样:

  1. 服务器软件
  2. 服务器日志文件
  3. Matomo提供的日志解析提交脚本
  4. 你的Matomo服务

你有没有发现什么问题?访问数据先是写入了文件,然后被脚本读取之后通过webapi传入Matomo分析,相比之下插入javascript代码的方式:

  1. 用户访问的页面中插入的脚本
  2. 你的Matomo服务

很容易看出导入服务器日志的劣势:获取到的访客信息简陋,传输路径长,耗时更久,耗费服务器资源更多。还有一个致命问题就是日志文件是不会也不能触发脚本执行的。所以Matomo建议的导入方式是通过crontab定期执行脚本导入,一般是每天凌晨导入前一天的日志。 这种延迟导入的方式又让我感觉别扭,难道不能把访客数据实时传输到Matomo吗?可以

服务器访问日志直传

根据官方教程,仅 Nginx 和 Apache 支持本功能,由于我不会使用Apache,所以下面只说Nginx。我的系统默认日志软件是rsyslog,如果你使用syslog-ng同样可以去查看官方教程

先放上传输路径:

  1. Nginx
  2. Nginx创建的access.sock
  3. rsyslog脚本监听socket并传入matomo.sh脚本
  4. Matomo提供的日志解析提交脚本
  5. 你的Matomo服务

简单来说就是用syslog解决了文件不能触发脚本执行的痛点,也防止了重复导入数据。但在资源消耗上仍然不敌插入javascript脚本的方式。从官方描述上也可以看出这个方案主要针对的还是高性能主机。像我这种访问量低到一定地步的低性能主机倒也不在乎多花费的一点资源。

插入javascript脚本仍然是最佳选择

看过上面分析的你一定了解到了,在经常有人访问的博客、论坛之类的网站使用插入javascript的方式更节省服务器资源也能获得更详细的访客信息,而博客、论坛也往往提供了添加自定义脚本的功能。 对于像使用nginx反代的、访客较少或不方便添加自定义脚本的站点、导入日志更加方便。但如果访客本身就不多的话,又为什么要使用一个如此重量级的分析工具呢?当然是好玩辣

安装配置

配置主程序

由于Matomo主要是使用php编写的,所以和其他常见的php站点类似,只要配置好服务器、数据库、把从官网下载的压缩包放入网站根目录即可。相信Matomo不是你第一个配置的php站点。 Matomo为wordpress用户准备了一个专用版本,此处不再赘述。

配置访问日志直传

在运行完主程序的初始化操作之后,修改以下几个文件

# nginx的主配置文件,我的在 /etc/nginx/nginx.conf
http {
...
# 你应该可以找到以 log_format main 开头的一行,那是默认日志,加在那之后吧
log_format matomo '{"ip": "$remote_addr",'
'"host": "$host",'
'"path": "$request_uri",'
'"status": "$status",'
'"referrer": "$http_referer",'
'"user_agent": "$http_user_agent",'
'"length": $bytes_sent,'
'"generation_time_milli": $request_time,'
'"date": "$time_iso8601"}';
...
server {
...
# 下面这行中的access.sock路径会在rsyslog中用到
access_log syslog:server=unix:/var/cache/nginx/access.sock,facility=local0 matomo;
...
}
}
# rsyslog的配置文件,我的在 /etc/rsyslog.d/10-matomo.conf
# socket to which you should send nginx data
$AddUnixListenSocket /var/cache/nginx/access.socket

# message starts with tag, "nginx: <...>", which we remove
$template matomo,"%msg:9:$%\n"

# uncomment following line to debug what is sent to matomo and in which format
# to check script part you could issue following command
# and expected result is "1 requests imported successfully":
# 'tail -1 /var/tmp/nginx.tmp | /usr/local/matomo/matomo.sh'

#local0.* /var/tmp/nginx.tmp;matomo

#下面这行中的matomo.sh路径要改成你的脚本的位置
if $syslogfacility-text == 'local0' then ^/usr/local/matomo/matomo.sh;matomo
#!/bin/sh
# 这个文件放在 /usr/local/matomo/matomo.sh ,也放在一个你喜欢的位置,注意和上面的脚本路径一致
# 注意修改下面的路径,如果你的matomo放在 /usr/local/ 就改成 /usr/local/matomo/misc/...
# 注意修改 --url 的值,改为你的matomo站点的url
# 注意修改 --token-auth 的值,在你登录matomo站点之后的api设置里可以找到
# 如果你想指定导入的站点,可以加上 --idsite= 参数,值为那个站点的id
# 如果你想记录静态文件的访问数据,加上 --enable-static 参数
# 其他参数请参考官方文档

echo "${@}" | /path/to/misc/log-analytics/import_logs.py \
--url=https://localhost/matomo/ --token-auth=<SECRET> \
--enable-http-errors --enable-http-redirects --enable-bots \
--recorders=4 --log-format-name=nginx_json -

之后在matomo的控制面板中添加新网站,如果服务器日志中有url对应的访问记录就会自动导入