goaccess

goaccess

@noob4ik

Утилита позволяет генерировать отчеты на основании access логов практически любых web серверов


Пример терзания файла с логом

Нужно было посмотреть статистику по geoip, браузерам и ОС клиента

# идем в папочку где аксесслоги лежат
cd logs/sitename
# распаковываем все логи
gunzip *.gz
# обьединяем все в один файл
cat sitename.acces.log* > sitename_full
# оставляем в логе только нужные даты
cat sitename_full | grep -E '1[3-9]/Aug/2017|2[0-3]/Aug/2017' > sitename_full_13-23
# смотрим все логи за даты
goreport sitename_full_13-23
# фильтруем логи по источнику - WAF - отсекаем внутренние IP
cat sitename_13-23 | grep 10.45.15.90 > sitename_13-23_n
goreport sitename_13-23_n
# находим точку входа в приложение и оставляем только ее
cat siteneame_13-23_n | grep /app?product_id=0000002 > sitename_13-23_n_open
goreport sitename_13-23_n_open


Установка в Debian 9

Сборка из исходников

apt install libncursesw5-dev libgeoip-dev
wget http://tar.goaccess.io/goaccess-1.2.tar.gz
tar -xzvf goaccess-1.2.tar.gz
cd goaccess-1.2/
./configure --enable-utf8 --enable-geoip=legacy
make
make install


Генерируем конфиг

Для того чтобы научить понимать формат лога - используем утилиту https://github.com/stockrt/nginx2goaccess

git clone https://github.com/stockrt/nginx2goaccess.git

# допустим мы имеем logformat main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" "$sent_http_content_length"'
# генерим на ее основе конфиг и складываем в /usr/local/etc/goaccess.conf
./nginx2goaccess/nginx2goaccess.sh '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" "$sent_http_content_length"' | tail -n4 > /usr/local/etc/goaccess.conf
# Делаем алиас для удобного запуска
echo 'alias goreport="goaccess -o /var/lib/goaccess/report.html -f"' >> ~/.bashrc
mkdir /var/lib/goaccess/


Настроим nginx - простейший конфиг для отдачи одного файла

apt install nginx
openssl dhparam 4096 -out /etc/nginx/ssl/dhparam.pem
Редактируем /etc/nginx/conf.d/goaccess.con

server {
  listen      80 default_server;
  server_name goaccess.sitename.com;
  access_log  /var/log/nginx/goaccess.80.access.log;
  error_log   /var/log/nginx/goaccess.80.error.log error;
  # Redirect all non-https requests
  return 301 https://goaccess.sitename.com$request_uri;
}
server {
  listen      443 default_server ssl http2;
  server_name goaccess.sitename.com;
  access_log  /var/log/nginx/goaccess.443.access.log;
  error_log   /var/log/nginx/goaccess.443.error.log error;
  # Certificate(s) and private key
  ssl_certificate /etc/nginx/ssl/multidomain.crt;
  ssl_certificate_key /etc/nginx/ssl/multidomain.key;
  # openssl dhparam 4096 -out /etc/nginx/ssl/dhparam.pem
  ssl_dhparam /etc/nginx/ssl/dhparam.pem;
  ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
  ssl_prefer_server_ciphers on;
  ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA512:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:ECDH+AESGCM:ECDH+AES256:DH+AESGCM:DH+AES256:RSA+AESGCM:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
  ssl_session_cache shared:TLS:2m;
  # OCSP stapling
  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 8.8.8.8;
  # Set HSTS to 365 days
  add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains';

  root /var/lib/goaccess;
  index report.html;

}


Report Page