分析低容量Nginx访问日志的解决方案

92 阅读3分钟

我最近把这个博客从AWS(S3 / Cloudfront)转移到一个最小的Ubuntu/Nginx设置。锁定是真的,所以我不仅要迁移我的静态网站(相当简单)和TLS证书,还要迁移域名。

但几个小时后,一切都完成了,一切都像以前一样运行,页面速度达到100分。

然而,有一个问题仍然存在。正如我在以前的文章中提到的,我没有在这个网站上运行任何跟踪器或广告,也不打算这样做。我对流量唯一感兴趣的统计数字是独立访客,以了解人们认为有用/愉快的阅读。

在AWS上,我只是简单地使用生成的Cloudfront ,但现在我必须想出一个新的,最好是最小的,解决这个问题的方案。

我很快找到了GoAccess,这是一个强大的命令行工具,用于分析访问日志,看起来很有希望--我在我的一个Nginx访问日志上试了一下,对输出结果很满意。我按照安装说明进行了设置和配置,以满足我的需要。

剩下的唯一问题是如何将我的访问日志从服务器上传到这个工具。幸运的是,我的用例相当简单--我只想得到所有现有的访问日志,并每隔几周看一下统计数据。

为了能够做到这一点,我写了下面这个简单的脚本。

Nginx访问日志脚本

这个脚本的前提条件是,在你的日志所在的系统上有一个sudo 用户,并且有ssh

#!/bin/bash
HOST=some_ip_or_host
USER=someuser

echo "Deleting old tmp logs..."
ssh $USER@$HOST 'sudo rm -rf /tmp/nginx_logs/'

echo "Copying access logs to tmp..."
ssh $USER@$HOST 'sudo mkdir -p /tmp/nginx_logs/'
ssh $USER@$HOST 'sudo cp /var/log/nginx/access.* /tmp/nginx_logs/'

echo "Chowning logs..."
ssh $USER@$HOST 'sudo chown -R ${USER} /tmp/nginx_logs'

echo "Extracting logs..."
ssh $USER@$HOST 'for file in /tmp/nginx_logs/*.gz; do gunzip -c "${file}" > /tmp/nginx_logs/$(basename "${file}" .gz); done'

echo "Concatenating logs..."
ssh $USER@$HOST 'for file in /tmp/nginx_logs/*; do cat "${file}" >> /tmp/nginx_logs/access.concat.log; done'

echo "Downloading concatenated access log..."
scp $USER@$HOST:/tmp/nginx_logs/access.concat.log /tmp/bloglog.log

echo "Starting GoAccess..."
goaccess /tmp/bloglog.log

首先,我们配置主机和用户,这样我们就不必每次都输入它们了。然后,我们简单地删除以前复制的日志。当然,这可以通过只复制新文件来进行微不足道的优化,但对于我目前的数据量来说,这完全没有必要。

然后,我们把所有的访问日志复制到一个临时文件夹,让自己成为所有者,这样我们就可以进行一些操作,然后用scp下载。

继而,我们gunzip ,将压缩后的日志用cat ,串联到access.concat.log 文件中。

一旦文件被写入,我们就用scp 下载,然后用目标文件运行goaccess

这就是了。运行这个脚本将打开GoAccess ,里面有你串联的访问日志。这里有一个关于如何配置和使用GoAccess的漂亮教程。

总结

这是一个分析低容量Nginx访问日志的非常简单的解决方案。到目前为止,GoAccess在极简主义、速度和可靠性方面被证明是一个很好的选择(至少对我的小型使用案例而言)。

我是一个极简工具链的忠实粉丝,尤其是对于我自己的个人项目,虽然上面概述的解决方案可以在很多方面进行优化,但它以一种可靠的方式完全满足了我的需要--目前来说已经足够好了,如果有更多的使用案例出现,我们将看到它可以适应这些案例。)

资源