sysmerge IT

12 янв. 2018 г.

goaccess анализатор логов - настройка онлайн мониторинга трафика на сайтах

Goaccess.io - анализатор логов, который в итоге выдает нагора симпатичные графики по всевозможным параметрам, которые будут спаршены с логов соответственно (юзерагенты, ипишки, запросы, виртуалхосты, реферы и тд). Более того, кроме вывода в консоль позволяет генерировать выхлоп в .html, например, и даже быть динамическим, используя вебсокеты для обновления данных.
Итак, сделаем простую настройку. Будем считать, что у нас несколько сайтов и, соответственно, несколько логов для каждого из них. Goaccess умеет кушать несколько логов.
В первую очередь нужно будет чуть-чуть подправить стандартный log_format nginx, создадим такой:
log_format goaccess '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
По сути он выглядит как дефолтный, только мы добавили туда вывод имени хоста - $host. Он пригодится нам для разделения результата парсинга логов по виртуалхостам.
Как устанавливать сам goaccess описывать не буду, более того для популярных дистрибутивов данное По можно ставить прямо с пакетного менеджера. Если что инструкции тут.
У нас система Centos 7. Глобальный конфиг Goaccess лежит тут /etc/goaccess.conf. Нам нужно внести туда несколько правок, настроив, соответственно, формат времени из логов, формат даты, и сам формат лога, то есть шаблон, по которому Goaccess будет парсить строки из логов.
Тут нам поможет один неплохой скрипт - https://github.com/stockrt/nginx2goaccess, который
ест на входе формат логов nginx и выдает нам нужные параметры для конфига goaccess.
# ./nginx2goaccess.sh '$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'

- Generated goaccess config:
time-format %T
date-format %d/%b/%Y
log_format %v %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u"
Соответственно используем эти настройки в goaccess.conf, а так же перечисляем файлы логов для парсинга:
log-file /var/log/nginx/site1.access
log-file /var/log/nginx/site2.access
log-file /var/log/nginx/site3.access
Стоит отметить, что имеются предопределенные шаблоны стандартных форматов логов, времени и даты для различных серверных решений, которых вам может вполне хватить .
И запускаем goaccess в виде демона, с динамическим обновлением, который будет писать html в один из сайтов, сюда, например,  /var/www/site1.ru/report.html:
 goaccess  -o  /var/www/site1.ru/report.html --real-time-html  --daemon
Внезапно можем обнаружить, что автоматическая обновление данных не работает, а слева лампочка не горит зеленым (сообщающая о том, что вебсокет работает). Проверяем, слушается ли порт 7890
# netstat -alpn | grep 7890
tcp        0      0 0.0.0.0:7890            0.0.0.0:*               LISTEN      20602/goaccess 
Значит проблема  в том, что порт закрыт. В iptables суем
iptables-A INPUT -p tcp -m state --state NEW -m tcp --dport 7890 -j ACCEPT
Оп, и все заработало.