Home » Установка Elasticsearch, Logstash и Kibana (ELK стек) на Ubuntu 24
Установка Elasticsearch, Logstash и Kibana (ELK стек) на Ubuntu 24

Установка Elasticsearch, Logstash и Kibana (ELK стек) на Ubuntu 24

Если вы когда-нибудь сталкивались с анализом огромных массивов логов, то наверняка понимаете, что `grep` и `awk` в какой-то момент перестают справляться. Особенно когда нужно не просто найти ошибку, а построить дашборд для мониторинга или настроить алерты. В этом материале разберём пошаговую установку ELK стека на Ubuntu 24.04 — связки Elasticsearch, Logstash и Kibana, которая превратит ваши логи из хаотичного текста в удобные графики и уведомления.

Мы пройдём весь путь от чистой системы до рабочего стека, рассмотрим типичные подводные камни и поделимся практическими советами для production-окружения. Если вам нужен надёжный VPS для развёртывания ELK или производительный выделенный сервер для большой нагрузки — самое время это организовать.

Как работает ELK стек

ELK расшифровывается как Elasticsearch + Logstash + Kibana, хотя сейчас к аббревиатуре часто добавляют Beats (получается BELK). Каждый компонент выполняет свою роль:

  • Elasticsearch — поисковая и аналитическая база данных, построенная на Apache Lucene. Хранит и индексирует данные
  • Logstash — конвейер обработки данных, который собирает, парсит и трансформирует логи
  • Kibana — веб-интерфейс для визуализации данных и создания дашбордов

Принцип работы простой: Logstash забирает логи из различных источников, обрабатывает их и отправляет в Elasticsearch. Kibana подключается к Elasticsearch и предоставляет красивый интерфейс для поиска и визуализации.

Системные требования и подготовка

Для комфортной работы ELK стека рекомендуется:

  • RAM: минимум 4GB, рекомендуется 8GB+
  • CPU: 2+ ядра
  • Диск: SSD желательно, объём зависит от количества логов
  • Java: OpenJDK 11 или новее

Сначала обновляем систему и устанавливаем Java:

sudo apt update && sudo apt upgrade -y
sudo apt install openjdk-11-jdk -y
java -version

Проверяем, что Java установилась корректно. Также увеличиваем лимиты системы для Elasticsearch:

sudo echo "* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096" >> /etc/security/limits.conf

Установка Elasticsearch

Elasticsearch — сердце всей системы. Добавляем официальный репозиторий:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install elasticsearch -y

Важный момент: в версии 8.x по умолчанию включена безопасность с SSL/TLS. Для тестирования можно её отключить, отредактировав конфиг:

sudo nano /etc/elasticsearch/elasticsearch.yml

Добавляем или изменяем следующие параметры:

cluster.name: my-elk-cluster
node.name: node-1
network.host: localhost
http.port: 9200
discovery.type: single-node

# Отключаем security для простоты (НЕ для production!)
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false

Конфигурируем память для Elasticsearch:

sudo nano /etc/elasticsearch/jvm.options

Устанавливаем heap size (примерно половина от общей RAM):

-Xms2g
-Xmx2g

Запускаем и добавляем в автозагрузку:

sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
sudo systemctl status elasticsearch

Проверяем работу:

curl -X GET "localhost:9200/"

Должны увидеть JSON-ответ с информацией о кластере.

Установка Kibana

Kibana уже доступна в том же репозитории:

sudo apt install kibana -y

Настраиваем основные параметры:

sudo nano /etc/kibana/kibana.yml

Раскомментируем и настроим:

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
server.name: "kibana-server"

Запускаем Kibana:

sudo systemctl enable kibana
sudo systemctl start kibana
sudo systemctl status kibana

Kibana стартует не сразу — может потребоваться 1-2 минуты. Проверяем доступность:

curl -I http://localhost:5601

Установка Logstash

Logstash — самый гибкий и одновременно сложный компонент:

sudo apt install logstash -y

Создаём простой конфиг для тестирования:

sudo nano /etc/logstash/conf.d/test.conf

Базовый пример конфигурации:

input {
  file {
    path => "/var/log/syslog"
    start_position => "beginning"
  }
}

filter {
  grok {
    match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{WORD:hostname} %{WORD:program}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:message}" }
    overwrite => ["message"]
  }
  date {
    match => [ "timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "logstash-syslog-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }
}

Проверяем конфигурацию:

sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t

Если всё хорошо, запускаем:

sudo systemctl enable logstash
sudo systemctl start logstash
sudo systemctl status logstash

Настройка Nginx для безопасного доступа

Kibana по умолчанию доступна всем, поэтому настроим reverse proxy с базовой авторизацией:

sudo apt install nginx apache2-utils -y
sudo htpasswd -c /etc/nginx/.htpasswd admin

Создаём конфиг для Nginx:

sudo nano /etc/nginx/sites-available/kibana
server {
    listen 80;
    server_name your-domain.com;
    
    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/.htpasswd;
    
    location / {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

Активируем сайт:

sudo ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl restart nginx

Практические примеры конфигураций Logstash

Рассмотрим несколько полезных конфигураций для разных типов логов:

Apache/Nginx логи

input {
  file {
    path => "/var/log/nginx/access.log"
    type => "nginx_access"
  }
}

filter {
  if [type] == "nginx_access" {
    grok {
      match => { "message" => "%{NGINXACCESS}" }
    }
    date {
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
    }
    mutate {
      convert => [ "response", "integer" ]
      convert => [ "bytes", "integer" ]
    }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "nginx-access-%{+YYYY.MM.dd}"
  }
}

JSON логи приложений

input {
  file {
    path => "/var/log/app/application.log"
    codec => json
  }
}

filter {
  if [level] == "ERROR" {
    mutate {
      add_tag => ["error"]
    }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "app-logs-%{+YYYY.MM.dd}"
  }
}

Типичные проблемы и решения

Проблема Симптом Решение
Elasticsearch не запускается Ошибка в systemctl status Проверить heap size в jvm.options, увеличить RAM
Kibana показывает “Unable to connect to Elasticsearch” Красный статус в интерфейсе Убедиться, что Elasticsearch запущен и доступен
Logstash не обрабатывает логи Данные не попадают в Elasticsearch Проверить права доступа к файлам логов
Высокое потребление памяти Система зависает Настроить правильный heap size, добавить swap

Мониторинг и оптимизация

Для production-окружения важно настроить мониторинг самого ELK стека:

# Проверка статуса кластера
curl -X GET "localhost:9200/_cluster/health?pretty"

# Информация о индексах
curl -X GET "localhost:9200/_cat/indices?v"

# Статистика по нодам
curl -X GET "localhost:9200/_nodes/stats?pretty"

Полезные плагины для мониторинга:

  • Metricbeat — собирает метрики системы
  • Filebeat — более лёгкая альтернатива Logstash для простых кейсов
  • Heartbeat — мониторинг доступности сервисов

Масштабирование и высокая доступность

Для больших нагрузок рекомендуется:

  • Настроить кластер Elasticsearch из нескольких нод
  • Использовать несколько экземпляров Logstash
  • Добавить балансировщик нагрузки перед Kibana
  • Настроить репликацию индексов

Пример конфигурации для кластера:

cluster.name: production-cluster
node.name: node-1
network.host: 0.0.0.0
discovery.seed_hosts: ["node1.example.com", "node2.example.com"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

Альтернативы и сравнение

ELK стек не единственное решение для работы с логами:

  • Graylog — менее ресурсоёмкий, проще в настройке
  • Splunk — коммерческое решение с широким функционалом
  • Fluentd + Grafana — более лёгкая альтернатива
  • Loki (Grafana) — специализированное решение для логов

По статистике, ELK занимает около 35% рынка log management решений, что говорит о его популярности в enterprise-сегменте.

Интересные факты и нестандартные применения

ELK стек можно использовать не только для анализа логов:

  • Бизнес-аналитика — анализ пользовательского поведения
  • IoT мониторинг — сбор данных с датчиков
  • Финансовый анализ — обработка транзакций
  • Поиск по документам — полнотекстовый поиск

Elasticsearch изначально создавался Шайем Баноном для помощи жене в поиске рецептов, а сейчас используется в Netflix, GitHub, Wikipedia и многих других крупных проектах.

Автоматизация и скрипты

Для упрощения развёртывания можно создать bash-скрипт:

#!/bin/bash
# ELK Stack Auto Install Script

echo "Installing ELK Stack..."
sudo apt update
sudo apt install openjdk-11-jdk -y

# Add Elastic repository
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list

sudo apt update
sudo apt install elasticsearch kibana logstash -y

# Configure services
sudo systemctl enable elasticsearch kibana logstash
sudo systemctl start elasticsearch

echo "Waiting for Elasticsearch to start..."
sleep 30

sudo systemctl start kibana logstash

echo "ELK Stack installation completed!"
echo "Kibana available at: http://localhost:5601"

Также можно использовать Docker Compose для быстрого развёртывания:

version: '3.8'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    ports:
      - "9200:9200"
    
  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    
  logstash:
    image: docker.elastic.co/logstash/logstash:8.11.0
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch

Заключение и рекомендации

ELK стек — мощное решение для работы с логами, но требует продуманного подхода к развёртыванию и настройке. Для небольших проектов можно обойтись одним сервером, но для production-окружения стоит планировать кластерную архитектуру с самого начала.

Ключевые рекомендации:

  • Начинайте с малого — сначала настройте базовую конфигурацию
  • Мониторьте ресурсы — ELK может быть очень «прожорливым»
  • Планируйте индексы — настройте ротацию и удаление старых данных
  • Используйте ILM — Index Lifecycle Management для автоматизации
  • Безопасность прежде всего — не оставляйте порты открытыми

ELK стек особенно эффективен для DevOps-команд, системных администраторов и разработчиков, которые работают с микросервисной архитектурой. Он позволяет централизованно собирать логи со всех сервисов и быстро находить причины проблем.

Для серьёзных проектов рекомендую использовать VPS с достаточным объёмом RAM или выделенный сервер для кластерной установки. Помните: время, потраченное на правильную настройку ELK стека, окупится многократно при первой же серьёзной проблеме в production.

Официальная документация доступна на elastic.co, а исходный код — на GitHub. Удачи в настройке!


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked