0%

Nginx-GoAccess

GoAccess

GoAccess是一个基于终端的快速日志分析器。其核心思想是实时快速分析和查看Web服务器统计信息,而无需使用您的浏览器(如果您希望通过SSH快速分析访问日志,或者只是喜欢在终端中工作),终端输出是默认输出,但它能够生成完整的,独立的实时 HTML报告(非常适合分析,监控和数据可视化),以及a JSON和CSV报告。

  • 数据持久性强,GoAccess能够通过磁盘上的B + Tree数据库逐步处理日志。
  • GoAccess是用C语言编写的,要运行它,你只需要将ncurses作为依赖项,它甚至还具有自己的RFC6455兼容Web Socket服务器。
  • 跟踪提供请求所需的时间。如果您想跟踪减慢网站速度的网页,则非常有用。
  • GoAccess允许任何自定义日志格式字符串。预定义选项包括Apache,Nginx,Amazon S3,Elastic Load Balancing,CloudFront等。
  • 所有面板和指标都定时在终端输出上每200毫秒更新一次,在HTML输出上每秒更新一次。

安装

  • yum install goaccess

    • 如果提示错误:为仓库 ‘appstream’ 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist
    1
    2
    3
    cd /etc/yum.repos.d/
    sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
    sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
  • 修改goaccess配置文件

1
2
3
4
[root@VM-12-14-centos ~]# whereis goaccess
goaccess: /usr/bin/goaccess /etc/goaccess /usr/share/man/man1/goaccess.1.gz
# 配置文件在/etc/goaccess里面
vim goaccess.conf
  • 配置内容说明
1
2
3
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h - %^ [%d:%t %^]; "%r" %s %b "%R" - %^"%u" - %^ %T
  • real-time-html 用来使用实时刷新特性。
  • port 是用来和浏览器通信的,选一个没被占用的就行(别忘了在防火墙里开启端口)。
  • 如果你不走 https 的话,ssl-cert,ssl-key,ws-url 都不是必需的。
  • output:存放 goaccess 的站点目录。
  • log-file:goaccess 的日志文件。

注意

三个 format 的设置要与 nginx 的设置一致

1
2
3
4
5
6
7
8
9
10
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

# 或者
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$connection $upstream_addr '
'$upstream_response_time $request_time';

format说明

log-format 与 access.log 的 log_format 格式对应,每个参数以空格或者制表符分割

1
2
3
4
5
6
7
8
9
10
11
12
13
14
%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 请求所花费的时间,单位秒
%^ 忽略这一字段
  • 可以使用 nginx2goaccess.sh 将 nginx 日志格式格式化为 goaccess 能识别的日志格式,nginx2goaccess.sh
    • sh nginx2goaccess.sh '<log_format>' #log_format为你nginx.conf中配置的日志格式
1
2
# 例子
bash nginx2goaccess.sh '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" $connection $upstream_addr $upstream_response_time $request_time'
  • Console

将上述格式填写到 goaccess 配置文件中,先重启 nginx 之后再重启 goaccess 即可。

1
2
3
time-format %T
date-format %d/%b/%Y
log_format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" "%^" %^ %^ %^ %T

使用方法

冷日志分析

并不是实时数据,需要看的时候手动去生成对应的页面或者其他格式文件即可。

1
2
3
# /var/log/nginx/access.log 是nginx 默认的log位置,注意这个日志会按照日期切割。
goaccess -a -d -f /var/log/nginx/access.log --log-format=COMBINED -o nginx.html
# 输出一个nginx.html页面。

定时任务

可以通过定时任务更新输出html内容

1
2
3
4
5
6
7
# 创建脚本 nginx.sh编辑内容。
# 脚本执行。
#!/bin/bash
#页面转换为中文
LANG="zh_CN.UTF-8"
#输出HTML分析报告
goaccess -a -d -f /var/log/nginx/access.log --log-format=COMBINED -o nginx.html
  • 创建定时任务
1
2
3
4
5
# 分配权限
chmod 755 /usr/local/goaccess/scripts/nginx.sh
crontab -e
#定时生成项目的nginx日志分析html报告
0 0 * * * /bin/bash /usr/local/goaccess/scripts/nginx.sh

实时日志查看

在goaccess.conf中,需要配置real-time-html true 、output 输出位置。

1
2
3
4
5
6
7
8
9
10
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h - %^ [%d:%t %^]; "%r" %s %b "%R" - %^"%u" - %^ %T
real-time-html true # 设置ture
port <port> # 端口号
ssl-cert <cert.crt> # https需要证书
ssl-key <priv.key> # https需要证书
ws-url wss://<your-domain>:<port>
output /usr/local/src/goaccess/index.html # 输出位置
log-file /usr/local/src/goaccess/goaccess.log #日志文件。
  • 编辑nginx配置文件添加内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   server {
listen 80 default_server;
listen [::]:80 default_server;
server_name goaccess;
#root /usr/share/nginx/html;
root /usr/local/src/goaccess;

# Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
  • 演示并不做权限拦截,如果要使用权限拦截可以使用htpassed
1
2
3
4
5
# 安装
yum -y install httpd-tools
# 设置用户名和密码,并把用户名、密码保存到指定文件中:
#例:htpasswd -c /etc/nginx/passwd you
htpasswd -c [passwfile] [username]
  • 修改nginx配置文件
1
2
3
4
5
6
7
8
9
10
11
server {
listen 443 ssl;

location /goaccess {
#新增下面两行
auth_basic "Please input password"; #这里是验证时的提示信息
auth_basic_user_file /etc/nginx/passwd;

alias /usr/local/src/goaccess/nginx.html;
}
}
  • 重启nginx,并访问/goaccess。

END