Получение статистики посещений на сайте (анализ лога Nginx)

СВК
Published

Стало тут вдруг интересно а кто вообще и сколько и куда ходить на мой сайт. Поискал всякого в сети и нашел описание пакета goaccess. Анализатор логов. В дистрибутиве есть, так что поставил настроил и получил статистику. Правда пришлось перенастроить, пересобрать и перезапустить контейнеры.

Настройка nginx

Для начала пересобираем контейнер с nginx, так как по умолчанию nginx в докере логи пишет в stdout и stderr:

FROM jwilder/nginx-proxy

COPY uploadsize.conf /etc/nginx/conf.d/uploadsize.conf

# Удаляем символические ссылки на stdout/stderr
RUN rm -f /var/log/nginx/access.log /var/log/nginx/error.log

# Создаем файлы логов и назначаем права
RUN touch /var/log/nginx/access.log /var/log/nginx/error.log && \
    chown nginx:nginx /var/log/nginx/access.log /var/log/nginx/error.log

# Указываем, что логи должны быть записаны в файлы
RUN ln -sf /dev/stdout /var/log/nginx/access.log && \
    ln -sf /dev/stderr /var/log/nginx/error.log

Для доступа к файлам журналов, создаем и монтируем том при запуске контейнера. Кусок docker-compose.yml:

...
services:
  proxy:
    build: ./
    restart: always
    ports:
      - 80:80
      - 443:443
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: true
    volumes:
      - certs:/etc/nginx/certs:ro
      - vhost.d:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - proxy_logs:/var/log/nginx
    networks:
      - proxy-tier
    logging:
      options:
        max-size: 100m
        max-file: 5
...
volumes:
  proxy_logs:

Пересоздаем контейнер и запускаем. Если все прошло как надо, то мы увидим данные, cat /var/lib/docker/volumes/proxy_proxy_logs/_data/access.log:

git.nuk-svk.ru 54.225.181.161 - - [26/Feb/2025:15:37:34 +0000] "GET /svk/zimbra-alarm/issues?assignee=-1&milestone=0&poster=0&project=-1&q=&sort=oldest&state=open&type=all HTTP/1.1" 200 34649 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot) Chrome/119.0.6045.214 Safari/537.36" "172.18.0.2:3000"
git.nuk-svk.ru 18.215.49.176 - - [26/Feb/2025:15:37:34 +0000] "GET /svk/zimbra-alarm/issues?assignee=-1&milestone=-1&poster=0&project=0&q=&sort=oldest&state=open&type=all HTTP/1.1" 200 34647 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot) Chrome/119.0.6045.214 Safari/537.36" "172.18.0.2:3000"
git.nuk-svk.ru 100.24.149.244 - - [26/Feb/2025:15:37:38 +0000] "GET /svk/zimbra-alarm/issues?assignee=1&labels=&milestone=0&poster=0&project=-1&sort=oldest&state=open&type=all HTTP/1.1" 200 34632 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Amazonbot/0.1; +https://developer.amazon.com/support/amazonbot) Chrome/119.0.6045.214 Safari/537.36" "172.18.0.2:3000"

Настройка goaccess

В /etc/goaccess/goaccess.conf раскомментируем и, по необходимости, правим строки:

  • time-format %H:%M:%S
  • date-format %d/%b/%Y
  • log-format %v %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

Где:

  • %v — имя сервера (например, git.nuk-svk.ru).
  • %h — IP-адрес клиента.
  • %^ — игнорируемое поле.
  • %d — дата.
  • %t — время.
  • %r — запрос.
  • %s — код статуса.
  • %b — размер ответа.
  • %R — реферер.
  • %u — User-Agent.

И проверяем:

goaccess -a /var/lib/docker/volumes/proxy_proxy_logs/_data/access.log -o stat.html

В результате файл будет представлять собой нечто подобное

nginx-stat.png

Программа позволяет получать статистику в реальном времени, для этого используется опция --real-time-html goaccess /var/lib/docker/volumes/proxy_proxy_logs/_data/access.log -o stat.html --real-time-html. Т.е. при обращении к файлу stat.html через вэб сервер, запросы будут перенаправлены через web-сокет к запущенному сервису.

Сайт GoAccess