题图就是最终效果。
我这环境是后端机器Debian 12,前端缓存节点是Debian 11,所有缓存节点的日志发往后端机器,通过syslog-ng进行归纳、分析什么的。后续有空再单独写一下日志方面的细则。
我这里是在syslog-ng里面把所有收到的日志按照原样写入一个文件 /root/z/weblog.txt ,这样就实现了所有节点的日志聚合,还是比较方便的。但是不适合那种限流量的环境,毕竟日志其实挺大的。
安装goaccess很简单,用不着去编译的:
apt install -y lsb-release gpg wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | tee /usr/share/keyrings/goaccess.gpg >/dev/null echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/goaccess.list apt-get update apt-get install goaccess
这里用了官网的源,所以安装的就是最新版。如果直接用debian自己的源里面版本要低一些。
nginx里面的日志格式是这样的:
log_format main '"$clientRealIp","$server_addr","$fmt_localtime","$scheme","$server_protocol","$request_method","$host","$status","$sent_http_content_type","$body_bytes_sent","$request_uri","$http_referer","$http_user_agent"';
用了一些小手段让nginx日志的日期时间看着顺眼:
map $host $fmt_localtime { default ''; } log_by_lua_block { ngx.var.fmt_localtime = ngx.localtime(); }
在 /etc/goaccess/goaccess.conf 里面增加三行设置:
log-format "%h","%^","%d %t","%^","%H","%m","%v","%s","%^","%b","%U","%R","%u" date-format %Y-%m-%d time-format %H:%M:%S
注意,我这个日志格式仅适合我的配置,这玩意实际上很难搞,日期时间设置我用了一两个小时,挺操蛋的 -_- ,看起来真的很简单,但我反复折腾……
最后,启动一下,并且运行为后台模式就行了:
LANG="zh_CN.UTF-8" && goaccess /root/z/weblog.txt -o /var/www/www.tingtao.org/weblogreport.html --real-time-html --daemonize --pid-file=/var/run/goaccess_.pid
当然了,我机器上生成的文件路径肯定不是文中这个 *^_^*
============================
补充一下,我nginx日志里面的clientRealIp是这么生成的:
map $http_x_forwarded_for $clientRealIp { "" $remote_addr; ~^(?P<firstAddr>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+),?.*$ $firstAddr; }
这样做的好处是如果是在cdn后面,则可以自动提取正确的客户端IP
如果要开多个进程来生成多个报告,这样是可以的,但是需要pid和port做出区分,否则冲突了就不行。