基于Goaccess的Nginx日志审计——个人站点访问统计

前言

想要统计静态个人站点的访问者最喜欢浏览哪些文章?又或是有无恶意用户尝试攻击站点?如果你的站点是通过nginx等代理部署的,那么可以对nginx日志进行解析审计以解答上述问题。

Nginx日志结构

默认安装好nginx后,nginx就会将请求分类记录到对应的日志中,正常的请求记录在/var/log/nginx/access.log中,严重错误的请求记录在/var/log/nginx/error.log中.

通过tail命令可以在终端上查看最新的请求日志

tail -f /var/log/nginx/access.log

Nginx日志接入数据库

先查阅google看前人的工作,发现如下几篇文章和工具:

工具:

  • rsyslog

    一款可以具有日志消息过滤、转发等功能的开源程序

  • ……

Hugo博客+nginx部署+goaccess访问统计

Hugo博客

参考https://gohugo.io

Nginx部署

将打包后的Hugo博客站点资源文件存放到frontend_directory目录下,基于Nginx最简单的一种部署方式就是直接新开放一个端口用于提供前端资源服务。

server {
    listen 10229;
    server_name 127.0.0.1;

    location / {
        root frontend_directory;
        index index.html ;
        error_page 404 404.html;
    }
}

访问统计

  • 日志文件解析

  • 日志报告

goaccess

配置

根据nginx log_format生成goaccess相关配置

./nginx2goaccess.sh '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'

简单验证是否可成功解析access.log日志:

sudo goaccess -f /var/log/nginx/access.log --log-format='%h - %^ [%d:%t %^] "%r" %s %b "%R" "%u"' --date-format=%d/%b/%Y --time-format=%T

系统级安装及使用方案

sudo apt install goaccess

解析日志并生成报表(静态):

sudo goaccess -a -d -f /var/log/nginx/access.log -p /etc/goaccess.conf -o /path/to/goaccess.html

实时日志:

sudo goaccess -a -d -f /var/log/nginx/access.log -p /etc/goaccess/goaccess.conf -o /path/to/goaccess.html --real-time-html --daemonize

–real-time-html参数会启动一个服务端进程,占用7890端口.

sudo goaccess -a -f /var/log/nginx/access.log -p /etc/goaccess/goaccess.conf -o /opt/spacetimelab/frontend/goaccess/report.html 

容器化方案:构建goaccess镜像

如果你无法直接拉取allinurl/goaccess镜像,使用如下方法构建。

git clone https://github.com/allinurl/goaccess.git goaccess && cd $_
docker build . -t allinurl/goaccess

过程中部分镜像可能拉取失败,可参考国内的 Docker Hub 镜像加速器,由国内教育机构与各大云服务商提供的镜像加速服务 | Dockerized 实践 https://github.com/y0ngb1n/dockerized · GitHub修改镜像源配置,本文写作时采用中科大源可成功拉取目标镜像。

启动服务
sudo tail -f /var/log/nginx/access.log | docker run -p 7890:7890 --name goaccess --rm -i -e LANG=$LANG allinurl/goaccess -a -o html --log-format COMBINED --real-time-html - >  /path/to/goaccess/report.html &
sudo tail -F /var/log/nginx/access.log | docker run -p 7890:7890 -v "/opt/spacetimeuser/frontend/goaccess/:/var/www/goaccess/:rw" --name goaccess_report --rm -i -e LANG=$LANG allinurl/goaccess -a -o /var/www/goaccess/report.html --log-format COMBINED --real-time-html - &
services:
  goaccess:
    build: .
    image: allinurl/goaccess
    restart: unless-stopped
    container_name: goaccess_server
    ports:
      - "127.0.0.1:7890:7890"
    volumes:
      - ./report:/srv/report
      - /var/log/nginx/access.log:/srv/logs/access.log:ro
      - ./goaccess.conf:/etc/goaccess/goaccess.conf:ro

  nginx:
    image: nginx
    restart: unless-stopped
    container_name: goaccess_nginx
    ports:
      - "127.0.0.1:7891:80"
    volumes:
      - ./report:/srv/report
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro## 
# nginx.conf
server {
  listen 80 default_server;
  root /srv/report;
  server_tokens off;  
}

资料汇总

CoolCats
CoolCats
理学学士

我的研究兴趣是时空数据分析、知识图谱、自然语言处理与服务端开发