Получение статистики посещений на сайте (анализ лога Nginx)
Стало тут вдруг интересно а кто вообще и сколько и куда ходить на мой сайт. Поискал всякого в сети и нашел описание пакета 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
В результате файл будет представлять собой нечто подобное
Программа позволяет получать статистику в реальном времени, для этого используется опция --real-time-html goaccess /var/lib/docker/volumes/proxy_proxy_logs/_data/access.log -o stat.html --real-time-html
. Т.е. при обращении к файлу stat.html через вэб сервер, запросы будут перенаправлены через web-сокет к запущенному сервису.