GoAccess分析Nginx日志
背景
解决问题
最近搭建静态网站,并挂到了Google上,虽然可以通过Google Search Console后台查看曝光度等信息,但是无法实时的查看到网站真实的访问情况,这一点很可惜。恰逢遇到GoAccess工具,可以提供实时解析nginx、apache等之类日志的功能,同时将其输出为多种格式,如:json、csv、html。这对于静态网站而言是一大利器,解决了静态网站无法实时分析访问日志的弊端。
使用模块
GoAccess
前提:
本文以生成html文件为例子,json和csv也是同理,主要就是需要修改goaccess的配置文件中的output/out参数
参考文档
Github地址:https://github.com/allinurl/goaccess
使用
安装GoAccess,里面会有一些环境需要安装,这个可以根据报错提示的内容直接百度安装
直接安装
1
sudo apt install goaccess
手动安装(本文采用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17wget https://tar.goaccess.io/goaccess-1.4.1.tar.gz
tar -xzvf goaccess-1.4.1.tar.gz
cd goaccess-1.4.1/
编译过程中,如果提示需要安装什么环境,就直接安装后继续编译,比如本人缺少ncursesw环境
apt-get install libncursesw5-dev
utf8:懂得都懂;
--enable-geoip=mmdb:使用GeoIP2的数据库,GeoIP已经停止维护了
--enable-tcp=btree:使用磁盘存储解析出来的数据,只有这样才能够一直保存解析数据
./configure --enable-utf8 --enable-geoip=mmdb --enable-tcb=btree
make
make install
安装完成后,添加一个软连接到/usr/bin文件夹下,方便直接命令启动
ln -s /usr/local/bin/goaccess /usr/bin/goaccess安装官方最新
1
2
3
4echo "deb https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/goaccess.list
wget -O - https://deb.goaccess.io/gnugpg.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/goaccess.gpg add -
sudo apt-get update
sudo apt-get install goaccess
修改GoAccess的配置文件:GoAccess.conf,这个位置根据自己安装方式的不同可能会存在不同
goaccess.conf的完整配置文件是下载包的config/goaccess.conf,里面还有很多非常细致的配置信息,可以根据自己的需要进行设置,当然英文毕竟晦涩,但是完全可以通过百度翻译哈,其中log-format的详细参数说明可以查看文末拓展
1
2
3sudo vim ./path/goaccess.conf
修改完毕后建议将其移动到一个统一的配置文件目录下
sudo cp ./path/goaccess.conf /etc/goaccess/goaccess.conf唯一需要注意的是goaccess.conf的日志格式必须与nginx.conf中配置的日志记录格式保持一致
1
2此处是对应的log_format信息,与第三步的内容能够匹配上
log-format %h - %^ [%d:%t %^] requesthost:"%v"; "%r" requesttime:"%T"; %s %b "%R" - %^"%u"修改nginx的日志记录格式,该日志记录的信息一定要与goaccess.conf中log-format的格式一致
1
2
3
4
5
6
7
8
9
10
11
12
13由于使用了cdn,需要获取用户真实IP进行分析,将其赋值给变量$clientRealIP
map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}
添加日志记录的配置格式,将其命名为:myLog,将其配置在http模块下
log_format myformat '$clientRealIp - $remote_user [$time_local] requesthost:"$http_host"; "$request" requesttime:"$request_time"; '
'$status $body_bytes_sent "$http_referer" - $request_body'
"$http_user_agent" "$http_x_forwarded_for"';
设置日志记录的格式为自定义的配置格式
access_log /var/log/nginx/access.log myLog;配置完成后执行如下命令查看是否能够正常的生成html的文件
1
2执行完毕后需要到输出的路径下查看是否生成了html的文件,生成就表示可以了
sudo goaccess -p /path/to/goaccess.conf在nginx中配置用户访问的限制,主要不是想将该内容对所有人公开,该密钥是通过htpasswd
利用htpasswd创建auth_basic认证信息
1
2
3
4
5安装htpasswd
sudo apt-get install apache2-utils
htpasswd -bdc 密钥存放文件的路径 用户名 密码
htpasswd -bdc /path/to/http_auth/http_password user password修改nginx的配置文件信息
1
2
3
4
5
6配置访问日志页面的权限
location = /最帅的大帅比.html { # 就是指向生成的日志html页面
root /path/to/log/html;
auth_basic "请提交你的身份信息用于验证";
auth_basic_user_file ./path/to/http_auth/http_password;
}重启nginx,然后到前台访问这个页面,看要不要密码
1
sudo nginx -s reload
由于我们不打算使用实时生成的页面,所以此处就直接创建一个任务,用于定时的生成对应的html页面信息
1
2
3
4
5
6
7
8
9
10
11
12创建crontab的任务
任务格式:minute hour day month week command
crontab -e
此处设置的是每五分钟执行一次
*/5 * * * * sudo /usr/local/bin/goaccess -p /path/to/goaccess.conf
查看已经存在的任务
crontab -l
查看cron服务是否启动
service cron status
拓展
log-format参数说明:
%t
匹配time-format格式的时间字段%d
匹配date-format格式的日期字段%h
host(客户端ip地址,包括ipv4和ipv6)%r
来自客户端的请求行%m
请求的方法%U
URL路径%H
请求协议%s
服务器响应的状态码%b
服务器返回的内容大小%R
HTTP请求头的referer字段%u
用户代理的HTTP请求报头%D
请求所花费的时间,单位微秒%T
请求所花费的时间,单位秒%^
忽略这一字段
关于使用的IP库,本文使用的是GeoIP2库,但是在安装过程中发现还有别人针对国内做过优化的库,显示的会更为详细,此处我并没有做尝试了,只有安装的时候需要将–enable-geoip的参数设置为ip2region,其余的配置之类的都是一样的,现将相关的链接留下,以供参考
Goaccess包:https://github.com/rosbit/goaccess