Сбор и анализ логов Nginx с помощью Graylog2

Aug 21, 2017 14:51 · 468 words · 3 minute read nginx logs graylog2

Graylog2 — бесплатная open source система для централизованного сбора, хранения и анализа логов. Для работы ему нужна Java, конфигурацию он хранит в MongoDB, для поиска и хранения логов — ElasticSearch.

Давайте разберемся со сбором и анализом логов web-сервера Nginx с помощью Graylog2!

Для «быстрого развертывания» будем использовать docker-контейнеры, поэтому считаем что на вашем хосте уже установлен docker (например, так) и docker-compose.

Если же нет — выполняем следующие шаги для установки docker’а:

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce

Для установки последней версии docker-compose (версию смотрим здесь) используем следующие команды:

export dockerComposeVersion=1.14.0
curl -L https://github.com/docker/compose/releases/download/$dockerComposeVersion/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Создаем файл docker-compose.yml следующего содержания:

version: '2'
services:
  mongo:
    restart: always
    container_name: mongo
    image: "mongo:3"
    volumes:
      - /srv/graylog/data/mongo:/data/db
  elasticsearch:
    restart: always
    container_name: elasticsearch
    image: "elasticsearch:2"
    command: "elasticsearch -Des.cluster.name='graylog'"
    volumes:
      - /srv/graylog/data/elasticsearch:/usr/share/elasticsearch/data
  graylog:
    restart: always
    container_name: graylog
    image: graylog2/server:2.2.3-1
    volumes:
      - /srv/graylog/data/journal:/usr/share/graylog/data/journal
      - /srv/graylog/config:/usr/share/graylog/data/config
    environment:
      GRAYLOG_PASSWORD_SECRET: somepasswordpepper
      GRAYLOG_ROOT_PASSWORD_SHA2: 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
      GRAYLOG_WEB_ENDPOINT_URI: http://graylog.lc:9911/api/
    depends_on:
      - mongo
      - elasticsearch
    ports:
      - "9911:9000"
      - "12201:12201/udp"
      - "1514:1514/udp"
      - "12301:12301/udp"
      - "12302:12302/udp"

Находясь в каталоге с только что созданным файлом выполняем команду:

docker-compose up -d

После запуска контейнеров необходимо подождать пару минут (при первом запуске Graylog2 стартует дольше), после чего можно залогиниться в web-интерфейс (в нашем примере — по адресу http://graylog.lc:9911) используя стандартный логин и пароль: admin/admin.

Далее скачиваем контент-пак в json-формате по этой ссылке, в web-интерфейсе грейлога переходим на вкладку “System/Content Packs”, выбираем пункт “Import content pack” и загружаем скачанный json-файл.

После успешной загрузки контент пак nginx появится в пункте меню “Web Servers”, где можно ознакомиться с его описанием и обязательно нажать кнопку “Apply content”.

Также необходимо внести минимальное количество правок в конфигурационный(е) файл web-сервера Nginx. В конфигурационные файлы сайтов (секция server) необходимо добавить следующие директивы:

...
        access_log syslog:server=127.0.0.1:12301 graylog2_format;
        error_log syslog:server=127.0.0.1:12302;
...

Формат лога (graylog2_format) определяется в основном конфигурационном файле (nginx.conf) и выглядит так:

...
log_format  graylog2_format  '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for" <msec=$msec|connection=$connection|connection_requests=$connection_requests|millis=$request_time>';
...

Перечитываете конфиг Nginx командой:

nginx -s reload

и логи начинают поступать в Graylog2, где с ними можно очень удобно работать.

Кроме того, в составе установленного контент пака есть уже готовый дашборд с основными метриками web-сервера, а именно:

  • количество запросов за последние 24 часа (общее число + график, на котором видно динамику изменения кол-ва запросов);
  • количество запросов, завершившихся с кодом 4XX за последние 24 часа (общее число + график, на котором видно динамику изменения кол-ва запросов);
  • количество запросов, завершившихся с кодом 5XX за последние 24 часа (общее число + график, на котором видно динамику изменения кол-ва запросов);
  • версии HTTP-протокола, по которым обращаются к сайту за последние 24 часа (процент + общее число);
  • коды ответа на запросы за последние 24 часа (процент + общее число);
  • коды ответа на запросы за последний час (процент + общее число).
tweet Share