You are here

Установка и настройка стека ELK на Debian 10

«ELK» - это сокращение от трех проектов с открытым исходным кодом: Elasticsearch, Logstash и Kibana.

Установка и настройка стека ELK на Debian 10
  • Elasticsearch - это поисковая и аналитическая система.
  • Logstash - это конвейер обработки данных на стороне сервера, который получает данные из нескольких источников одновременно, преобразует их, а затем отправляет в «тайник», подобный Elasticsearch.
  • Kibana позволяет пользователям визуализировать данные с помощью диаграмм и графиков в Elasticsearch.
  • Beats — агенты для отправки логов в Logstash. Они бывают разные. Я буду использовать Filebeat для отправки данных из текстовых логов linux

Начнем установку на Debian 10

1. Установка JAVA openjdk-8-jre:

Logstash requires Java 8 or Java 11. Use the official Oracle distribution or an open-source distribution such as OpenJDK.

Следует отметить, что платформа существует в 2 форматах:

  • Open JDK — открытая версия.
  • Oracle Java — поддержка, доп. возможности и прочие радости вместе с ней.

1.1. Установка openjdk-8-jre:

Обновим пакетную базу Debian 10:

  1. apt-get update

Предварительно установим платформу JAVA:

  1. apt-get install openjdk-8-jre

Проверяем версию JAVA:

  1. java -version
  2. openjdk version "1.8.0_222"
  3. OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1~deb9u1-b10)
  4. OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

1.2. Установка openjdk-11-jdk (мы использовали её):

Ищем пакет:

  1. apt search openjdk

Ставим openjdk-11-jdk:

  1. sudo apt install openjdk-11-jdk

Переключаемся на версию openjdk-11-jdk:

  1. update-alternatives –config java

Проверяем версию:

  1. java -version
  2. openjdk version "11.0.5" 2019-10-15
  3. OpenJDK Runtime Environment (build 11.0.5+10-post-Debian-1deb10u1)
  4. OpenJDK 64-Bit Server VM (build 11.0.5+10-post-Debian-1deb10u1, mixed mode, sharing)

2. Установка Elasticsearch:

Скачаем и добавляем ключ репозитория:

  1. wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
  2. OK

Если у вас нет, скачаем и установим apt-transport-https пакет, позволяющий подключать репозитории по протоколу https (обычно репозитории подключаются через http или ftp):

  1. apt-get install apt-transport-https

Добавляем репозиторий:

  1. echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-6.x.list

* Вариант с 7.x у меня лично не стартовал сам сервис Elasticsearch:

  1. echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-7.x.list

Обновим еще раз информацию из репозиториев:

  1. apt-get update

Установим интересующие нас пакеты:

  1. apt-get install elasticsearch

*Установка занимает время! Установился elasticsearch 6.8.4. Версия 7.4.1 - Active: failed (Result: timeout).

После установки добавляем elasticsearch в автозагрузку:

  1. systemctl daemon-reload
  2. systemctl enable elasticsearch.service
  3.  
  4. Synchronizing state of elasticsearch.service with SysV service script with /lib/systemd/systemd-sysv-install.
  5. Executing: /lib/systemd/systemd-sysv-install enable elasticsearch
  6. Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /lib/systemd/system/elasticsearch.service.

Запускаем:

  1. systemctl start elasticsearch.service

Проверяем, запуск:

  1. systemctl status elasticsearch.service
  2.  
  3. elasticsearch.service - Elasticsearch
  4. Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)
  5. Active: active (running) since Sat 2019-10-26 02:15:00 +05; 12s ago
  6. Docs: http://www.elastic.co
  7. Main PID: 20418 (java)
  8. Tasks: 14 (limit: 1797)
  9. Memory: 1.1G
  10. CGroup: /system.slice/elasticsearch.service
  11. └─20418 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseC
  12.  
  13. окт 26 02:15:00 debsv systemd[1]: Started Elasticsearch.

* Стартанул не с первого раза.

Что можно сделать, если не стартует Elasticsearch?

  • Проверить права на папку var/log: "ls -l /var/log/elasticsearch/ /var/log/". Проверить пользователя: elasticsearch
  • Проверить выделенную память для JAVA: "java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|MaxMetaspaceSize|ThreadStackSize'"
  • Журнал CTL: "journalctl -f" / "journalctl --unit elasticsearch" / "journalctl -xe"
  • Проверить логи: /var/log/elasticsearch. Если ошибка "file:/var/lib/elasticsearch/nodes/0/_state/node-3.st" (подобное), удалить файл, перезапустить систему. Возникает из-за лишних данных, предыдущих версий.

Если все работает, читаем дальше.

Настройки Elasticsearch находятся в файле:

  1. /etc/elasticsearch/elasticsearch.yml

Отдельное внимание на параметр для директории с данными:

  1. # Будет занимать значительное место
  2. path.data: /var/lib/elasticsearch # директория для хранения данных

2.1. Проверяем работу Elasticsearch

Смотрим кто сидит на 9200 порту:

  1. netstat -lptun | grep 9200
  2. tcp6 0 0 127.0.0.1:9200 :::* LISTEN 14869/java
  3. tcp6 0 0 ::1:9200 :::* LISTEN 14869/java

Вы можете проверить, работает ли ваш узел Elasticsearch, отправив HTTP-запрос на порт 9200 на localhost, прямо на самом сервере:

  1. {
  2. "name" : "03cLTJX",
  3. "cluster_name" : "elasticsearch",
  4. "cluster_uuid" : "mgWgSLZCRLedfLIJASpxKQ",
  5. "version" : {
  6. "number" : "6.8.4",
  7. "build_flavor" : "default",
  8. "build_type" : "deb",
  9. "build_hash" : "bca0c8d",
  10. "build_date" : "2019-10-16T06:19:49.319352Z",
  11. "build_snapshot" : false,
  12. "lucene_version" : "7.7.2",
  13. "minimum_wire_compatibility_version" : "5.6.0",
  14. "minimum_index_compatibility_version" : "5.0.0"
  15. },
  16. "tagline" : "You Know, for Search"
  17. }

Если нет возможности получить доступ напрямую, можно удаленно отправить запрос:

  1. curl -X GET 'http://localhost:9200'
  2. {
  3. "name" : "03cLTJX",
  4. "cluster_name" : "elasticsearch",
  5. "cluster_uuid" : "mgWgSLZCRLedfLIJASpxKQ",
  6. "version" : {
  7. "number" : "6.8.4",
  8. "build_flavor" : "default",
  9. "build_type" : "deb",
  10. "build_hash" : "bca0c8d",
  11. "build_date" : "2019-10-16T06:19:49.319352Z",
  12. "build_snapshot" : false,
  13. "lucene_version" : "7.7.2",
  14. "minimum_wire_compatibility_version" : "5.6.0",
  15. "minimum_index_compatibility_version" : "5.0.0"
  16. },
  17. "tagline" : "You Know, for Search"
  18. }

По умолчанию Elasticsearch слушает все имеющиеся сетевые интерфейсы на порту 9200.

3. Установка Kibana:

Добавляем публичный ключ:

  1. wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -

Добавляем репозиторий Kibana:

  1. echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-6.x.list

Запускаем установку Kibana:

  1. apt-get update
  2. apt-get install kibana

Добавляем Kibana в автозагрузку

  1. systemctl daemon-reload
  2. systemctl enable kibana.service

Запускаем Kibana:

  1. systemctl start kibana.service

Проверяем состояние сервиса:

  1. systemctl status kibana.service

* На данном этапе никаких проблем не возникло, единственный момент: Kibana медленно стартует, надо ждать!

Файл с настройками Кибана располагается:

  1. /etc/kibana/kibana.yml

* По-умолчанию kibana слушает только localhost и не позволяет подключаться удаленно.

3.1. Проверяем работу Kibana:
Kibana слушает порт 5601:

  1. netstat -lptun | grep 5601
  2. tcp 0 0 127.0.0.1:5601 0.0.0.0:* LISTEN 15294/node

Так как мы настройку проводим удаленно, то в файле конфигурации прописали строчку:

  1. server.host: "192.168.0.11"

Заходим с текущей машины через браузер, на адрес: http://192.168.0.11:5601

Установка и настройка стека ELK на Debian 10

Подтверждаем, и видим что Все работает!

Установка и настройка стека ELK на Debian 10

4. Установка Logstash:
Тут все проще, просто ставим:

  1. apt-get install logstash

Добавляем в автозагрузку:

  1. systemctl enable logstash.service

Настройки Logstash находятся в файле:

  1. /etc/logstash/logstash.yml

4.1. Настройка Logstash:
Пока не запускаем, сначала его настроим. Его конфиг разделим по разным конфигурационным файлам в директории /etc/logstash/conf.d:

  1. nano input.conf

Заполняем input.conf:

  1. input {
  2. beats {
  3. port => 5044
  4. }
  5. }

* Указываю, что принимаем информацию на 5044 порт. Этого достаточно.

Создаем output.conf:

  1. nano output.conf

Заполняем output.conf:

  1. output {
  2. elasticsearch {
  3. hosts => "localhost:9200"
  4. index => "nginx-%{+YYYY.MM.dd}"
  5. }
  6. #stdout { codec => rubydebug }
  7. }

Создаем filter.conf:

  1. nano filter.conf

Заполняем filter.conf:

  1. filter {
  2. if [type] == "nginx_access" {
  3. grok {
  4. match => { "message" => "%{IPORHOST:remote_ip} - %{DATA:user} \[%{HTTPDATE:access_time}\] \"%{WORD:http_method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent_bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\"" }
  5. }
  6. }
  7. date {
  8. match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
  9. }
  10. geoip {
  11. source => "remote_ip"
  12. target => "geoip"
  13. add_tag => [ "nginx-geoip" ]
  14. }
  15. }

Пояснение:

  • Первое: фильтр, парсит логи nginx с помощью grok
  • Второе: используется модуль date для того, чтобы выделять дату из поступающих логов и использовать ее в качестве даты документа в elasticsearch
  • Третье: geoip фильтр, который на основе ip адреса, который мы получили ранее с помощью фильтра grok и записали в поле remote_ip, определяет географическое расположение.

Для работы geoip фильтр достаточно описать его в конфиге и скачать базу адресов в папку /etc/logstash:

  1. wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
  2. gunzip GeoLite2-City.mmdb.gz

Запускаем Logstash:

  1. systemctl start logstash.service

Проверяем:

  1. systemctl status logstash.service

Можно проверить логи: /var/log/logstash/logstash-plain.log

5. Установка Beats: Filebeat

Filebeat - это агент на сервере с nginx, для отправки логов веб сервера на сервер с ELK.

Ставим:

  1. apt-get install filebeat

* Вариант установки 2, используя репозиторий:

  1. curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.0-amd64.deb
  2. dpkg -i filebeat-6.4.0-amd64.deb

Нам нужно, по сути, выполнить две основные задачи: указать, какие файлы брать и куда отправлять результат. В установках по умолчанию Filebeat собирает все файлы в пути /var/log/*.log, это означает, что Filebeat соберет все файлы в каталоге /var/log/, заканчивающиеся на .log.

Источники с одинаковым input_type, log_type и document_type можно указывать по одному в строке. Если они отличаются, то создается отдельная запись.

Редактируем файл настроек:

  1. /etc/filebeat/filebeat.yml

Примерное содержание (дополняем файл):

  1. filebeat.inputs:
  2. - type: log
  3. # меняем с false на true
  4. enabled: true
  5. # меняем с "/var/log/*.log" на nginx
  6. paths:
  7. - /var/log/nginx/access.log*
  8. # добавляем следующее:
  9. fields:
  10. type: nginx_access
  11. fields_under_root: true
  12. scan_frequency: 5s
  13. # повторяем для error.log
  14. - type: log
  15. enabled: true
  16. paths:
  17. - /var/log/nginx/error.log*
  18. fields:
  19. type: nginx_error
  20. fields_under_root: true
  21. scan_frequency: 5s
  22. # дополняем:
  23. output.logstash:
  24. hosts: ["192.168.0.11:5044"]
  25. # дополняем:
  26. xpack.monitoring:
  27. enabled: true
  28. elasticsearch:
  29. hosts: ["http://192.168.0.11:9200"]

Сводная информация:

Elasticsearch (хранение логов):
nano /etc/elasticsearch/elasticsearch.yml (у нас network.host: 192.168.0.11)
systemctl restart elasticsearch.service
systemctl status elasticsearch.service
Проверка порта: netstat -lptun | grep 9200
http://localhost:9200
http://192.168.0.11:9200 (у нас)

Logstash (обработка входящих логов):
/etc/logstash/conf.d
nano input.conf (слушает порт 5044)
nano output.conf (связка с Elasticsearch "localhost:9200", у нас "http://192.168.0.11:9200")
nano filter.conf
Проверка на ошибки конфига: service logstash configtest
systemctl restart logstash.service
systemctl status logstash.service
Проверка порта: netstat -lptun | grep 5044

Kibana (web-интерфейс):
nano /etc/kibana/kibana.yml
systemctl restart kibana.service
systemctl status kibana.service
Проверка порта: netstat -lptun | grep 5601
PORT: 5601

Filebeat (Отображение логов в режиме real-time Linux-систем):
nano /etc/filebeat/filebeat.yml
systemctl restart filebeat
systemctl status filebeat
У нас:
monitoring: "http://192.168.0.11:9200"
output.logstash: "http://192.168.0.11:5044"

Перезагрузить все сервисы:
systemctl restart elasticsearch.service ; systemctl restart kibana.service; systemctl restart logstash.service ; systemctl restart filebeat ;
systemctl stop elasticsearch.service ; systemctl stop kibana.service; systemctl stop logstash.service ; systemctl stop filebeat ;
systemctl status elasticsearch.service ; systemctl status kibana.service; systemctl status logstash.service ; systemctl status filebeat ;

5. Проверка работы

Чтобы мониторинг работал, его надо активировать в соответствующем разделе в Kibana — Monitoring. И не забудьте запустить elasticsearch на внешнем интерфейсе. В первоначальной настройке я указал слушать только локальный интерфейс.

Заходим в раздел: "Management" - "Kibana" - "Index Patterns", нажимаем на "Create index pattern", в поле "Index pattern" указываем nginx-*. Далее "Next step" - Выберите имя поля @timestamp и жмите Create Index Pattern.

Установка и настройка стека ELK на Debian 10

Индекс добавлен, переходим в раздел Discover:

Установка и настройка стека ELK на Debian 10

Все настроили. Всем спасибо, кто читал)

Источник: http://linuxsql.ru