GoAccess分析Nginx日志

背景

  • 解决问题

    最近搭建静态网站,并挂到了Google上,虽然可以通过Google Search Console后台查看曝光度等信息,但是无法实时的查看到网站真实的访问情况,这一点很可惜。恰逢遇到GoAccess工具,可以提供实时解析nginx、apache等之类日志的功能,同时将其输出为多种格式,如:json、csv、html。这对于静态网站而言是一大利器,解决了静态网站无法实时分析访问日志的弊端。

  • 使用模块

    GoAccess

  • 前提:

    本文以生成html文件为例子,json和csv也是同理,主要就是需要修改goaccess的配置文件中的output/out参数

  • 参考文档

    官方网站:https://www.goaccess.cc

    Github地址:https://github.com/allinurl/goaccess

使用

  1. 安装GoAccess,里面会有一些环境需要安装,这个可以根据报错提示的内容直接百度安装

    • 直接安装

      1
      sudo apt install goaccess
    • 手动安装(本文采用)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      wget 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
      4
      echo "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
  2. 修改GoAccess的配置文件:GoAccess.conf,这个位置根据自己安装方式的不同可能会存在不同

    goaccess.conf的完整配置文件是下载包的config/goaccess.conf,里面还有很多非常细致的配置信息,可以根据自己的需要进行设置,当然英文毕竟晦涩,但是完全可以通过百度翻译哈,其中log-format的详细参数说明可以查看文末拓展

    1
    2
    3
    sudo 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"
  3. 修改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;
  4. 配置完成后执行如下命令查看是否能够正常的生成html的文件

    1
    2
    # 执行完毕后需要到输出的路径下查看是否生成了html的文件,生成就表示可以了
    sudo goaccess -p /path/to/goaccess.conf
  5. 在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
  6. 由于我们不打算使用实时生成的页面,所以此处就直接创建一个任务,用于定时的生成对应的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

    IP库:https://github.com/lionsoul2014/ip2region