Пересылка журналов Apache в OpenSearch через Logstash

Пересылка журналов Apache в OpenSearch через Logstash

Логи Apache — это ценный источник данных, но без структуры и анализа они бесполезны. Из нашей статьи вы узнаете, как настроить связку Logstash и OpenSearch для централизованного сбора логов, их обработки и визуализации.

Apache logo

В мире веб-разработки и системного администрирования логи — это ключи к пониманию работы приложений, диагностике ошибок и даже прогнозированию угроз. Apache, один из самых распространённых веб-серверов, генерирует огромные объёмы данных: каждый запрос, каждый сбой, каждое обращение к ресурсу фиксируется в access- и error-логах. Но необработанные raw-данные без структуры почти бесполезны — важно видеть картину целиком.

Именно здесь на сцену выходит связка Logstash и OpenSearch. Logstash выступает в роли «мозга», преобразующего сырые логи в структурированные события, а OpenSearch становится надёжным хранилищем, где данные можно мгновенно находить, фильтровать и изучать через интуитивные дашборды.

Рассмотрим настройку передачи журналов из Apache в OpenSearch через Logstash — как правило, на выделенном сервере или VPS. Вы узнаете, как избежать типичных ошибок при парсинге сложных форматов, как защитить канал передачи данных и как оптимизировать производительность Logstash под высокие нагрузки.

Аренда VPS/VDS от 219 руб/месяц

Преимущества VPS в AdminVPS:

✓ Бесплатное администрирование

✓ Только быстрые NVMe-диски

✓ Защита от DDoS-атак

✓ Быстрая техподдержка

Аренда VPS/VDS виртуального сервера от AdminVPS — это прозрачная и честная услуга с доступной ценой

Подготовка инфраструктуры

Прежде чем настраивать передачу журналов веб-сервера, убедитесь, что все компоненты системы готовы к интеграции. Не пропускайте этап подготовки, чтобы не столкнуться с ошибками вроде «Permission denied» или внезапной остановкой Logstash из-за нехватки ресурсов.

Требования к окружению

  • Сервер с Ubuntu/CentOS. Для тестов подойдёт даже маломощный VPS (1 CPU, 2 GB RAM). Однако если вы планируете обрабатывать больше 10 000 запросов в секунду, выбирайте конфигурацию с запасом ресурсов и SSD-диском — для снижения задержек при чтении логов. При использовании облачных хостингов активируйте автоматическое резервное копирование сервера — это спасёт конфиги при случайном сбое.
  • Apache2 с модулем mod_log_config, который отвечает за форматирование логов. Проверьте, активен ли он:
apache2ctl -M | grep log_config   # на Ubuntu  
httpd -M | grep log_config   # на CentOS  

Если модуль не найден, подключите его через:

sudo a2enmod log_config && sudo systemctl restart apache2  # на Ubuntu  
  • Убедитесь, что в конфигурации виртуальных хостов (например, /etc/apache2/sites-available/000-default.conf) указан полный путь к логам:
CustomLog ${APACHE_LOG_DIR}/access.log combined  
ErrorLog ${APACHE_LOG_DIR}/error.log  
  • Managed OpenSearch Cluster. Для production-среды выбирайте managed-решения. Они избавляют от рутинных задач, таких как настройка репликации или обновление версий. При создании кластера включите опцию Fine-grained access control — это позволит гибко управлять правами пользователей Logstash через роли.

Проверьте работу Apache

  • Убедитесь в корректности конфигурации веб-сервера. Статус службы:
sudo systemctl status apache2 --no-pager     

Вы увидите подробный вывод без постраничной навигации. Ищите строку Active: active (running). Если статус failed, проверьте логи:

journalctl -u apache2 -n 50
  • Тестовый HTTP-запрос:
curl -I http://localhost  

Ожидаемый ответ: HTTP/1.1 200 OK (или другой код в зависимости от контента).

Если возникает ошибка Connection refused, проверьте, слушает ли Apache порт 80:

sudo ss -tulpn | grep ':80'  
  • Генерация тестового трафика с имитацией запросов (100 запросов, 10 параллельных соединений):
ab -n 100 -c 10 http://localhost/  
  • Расположение журналов Apache. Пути к логам зависят от ОС и версии Apache, стандартные пути в Ubuntu/Debian:
Access log: /var/log/apache2/access.log
Error log: /var/log/apache2/error.log

В CentOS/RHEL:

Access log: /var/log/httpd/access_log
Error log: /var/log/httpd/error_log

Обязательно уточните пути в конфигурации:

apache2ctl -S | grep "Main ErrorLog"  # Ubuntu  
httpd -S | grep "Main ErrorLog"   # CentOS  

Теперь, когда Apache настроен, логи доступны для чтения, а сеть не блокирует соединения — можно переходить к установке Logstash. Но перед этим сохраните резервную копию конфигов Apache:

sudo tar -czvf apache_backup.tar.gz /etc/apache2/ /var/log/apache2/  

Установка Logstash и расширенная настройка

Logstash logo

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

Если вы используете кастомные сборки Java или нестандартные версии Ruby, выбирайте установку через Docker — это избавит от конфликтов зависимостей.

Процесс установки:

  1. Предварительно обновите установленное ПО, чтобы избежать конфликтов.
  2. Добавление репозитория Elastic

Elastic предоставляет официальные репозитории для Logstash.

  • Для Ubuntu/Debian

Импортируйте GPG-ключ:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg

Добавьте репозиторий:

echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list

Обновите индекс пакетов:

sudo apt update  
  • Для CentOS/RHEL

Создайте файл репозитория:

sudo tee /etc/yum.repos.d/elastic.repo <<EOF
[elastic-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

Обновите кеш:

sudo yum clean all && sudo yum makecache  
  1. Установка Logstash

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

sudo apt install logstash   # Ubuntu/Debian 
sudo yum install logstash  # CentOS/RHEL  

Особенности установки на Ubuntu 22.04+

Проблема с GPG-ключами

Иногда Ubuntu может блокировать добавление сторонних репозиториев из-за установленных политик безопасности. Если sudo apt update выдаёт ошибку NO_PUBKEY, выполните:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <отсутствующий_ключ>  

Ключ найдите на странице Elastic.

Настройка системного юнита

По умолчанию Logstash запускается с параметрами JVM, которые не всегда подходят для слабых серверов. При нехватке памяти Logstash начнёт использовать swap, что приведёт к лавинообразному росту задержек. Измените настройки в /etc/logstash/jvm.options:

-Xms512m  # Минимальный объём памяти  
-Xmx2g    # Максимальный объём (не больше 50 % от RAM сервера)  

Установка через Docker

Docker-контейнеры — идеальный выбор, если вы не хотите вносить изменения в основную систему. Пример команды для запуска:

docker run -d \
  --name logstash \
  --memory="2g" \
  --cpus="1" \
  -v /etc/logstash/pipeline/:/usr/share/logstash/pipeline/ \
  -v /var/log/apache2/:/var/log/apache2/ \
  docker.elastic.co/logstash/logstash:8.12.2

Оптимизация контейнера

  • Ограничьте ресурсы, чтобы Logstash не использовал всю память:
--memory="2g" \
--cpus="1"
  • Для ускорения обработки данных смонтируйте директорию /usr/share/logstash/data как tmpfs:
--tmpfs /usr/share/logstash/data:rw,size=512m  

Проверка установки

После установки выполните:

 /usr/share/logstash/bin/logstash --version  

Протестируйте работоспособность простым пайплайном:

echo "Hello, Logstash!" | /usr/share/logstash/bin/logstash -e '
input { stdin { } }
output { stdout { codec => rubydebug } }
'

Вы должны увидеть структурированный JSON:

{
  "message" => "Hello, Logstash!",
  "host" => "your-server",
  "@timestamp" => "2025-03-15T12:34:56.789Z"
}

Настройка прав доступа

Logstash по умолчанию работает под пользователем logstash, а ему могут быть недоступны логи Apache. Решите эту проблему одним из способов:

  • Добавьте logstash в группу adm (рекомендуется для Ubuntu):
sudo usermod -aG adm logstash  
  • Измените разрешения на доступ к папке с логами:
sudo chmod 0750 /var/log/apache2/
sudo setfacl -Rm u:logstash:rX /var/log/apache2/  

Проверка прав:

sudo -u logstash cat /var/log/apache2/access.log  

Если команда завершается ошибкой, вернитесь к шагам выше.

Сетевые настройки

Если Logstash и OpenSearch развёрнуты на разных серверах, то разрешите в Firewall исходящие подключения с Logstash-сервера на порт OpenSearch (обычно 9200 или 25060 для SSL — это значение по умолчанию для Managed OpenSearch, но в вашей конфигурации порт может отличаться):

sudo ufw allow out proto tcp to <opensearch-ip> port 25060  

Тест сетевой связности:

nc -zv <opensearch-host> 25060  # Проверка открытого порта

curl -X GET "https://<opensearch-host>:25060/apache_access/_search?q=response:500" \
  -u logstash:пароль_для_logstash

Настройка автоматического перезапуска

Если Logstash падает при ошибках в конфигах, система не перезапустит его по умолчанию. Исправьте это, добавив в /etc/systemd/system/logstash.service.d/override.conf:

[Service]
Restart=always
RestartSec=30  

Примените изменения:

sudo systemctl daemon-reload
sudo systemctl restart logstash  

Взаимодействие компонентов

Убедитесь, что все компоненты взаимодействуют корректно:

sudo systemctl status logstash  # Статус службы

curl -X GET "http://localhost:9600/_node/stats"  # Метрики в JSON

Если в логах (/var/log/logstash/logstash-plain.log) нет ошибок типа Could not load Java Native Access (JNA), значит, среда готова к работе.

Конфигурация Logstash

Структура конфига

Input — чтение данных. Для Apache используйте плагин file:

input {
  file {
    path => "/var/log/apache2/*.log"
    start_position => "beginning"
    ignore_older => 86400  # Игнорировать файлы старше 24 часов
  }
}

Filter — парсинг через Grok. Базовый шаблон для access-логов:

filter {
  grok {
    match => { "message" => "%{HTTPD_COMBINEDLOG}" }
  }
  mutate {
    remove_field => ["message"]  # Удаление сырого текста
  }
}  

Output — отправка в OpenSearch с TLS:

output {
  opensearch {
    hosts    => ["https://node1:9200"]
    user     => "doadmin"
    password => "пароль"
    ssl      => true
    cacert   => "/etc/logstash/certs/cert.pem"
  }
}

Проверка

Тест синтаксиса:

/usr/share/logstash/bin/logstash -t -f /etc/logstash/conf.d/apache.conf  

Поиск ошибок парсинга:

grep "_grokparsefailure" /var/log/logstash/logstash-plain.log  

После настройки пайплайна проверьте, поступают ли данные в OpenSearch:

curl -X GET "https://<opensearch-host>:25060/apache_access/_search?pretty" -u doadmin:пароль

Интеграция с Managed OpenSearch

Managed OpenSearch упрощает развёртывание кластера. Рассказываем, как создать безопасное окружение, оптимизировать индексы и автоматизировать управление данными.

Создание ролевой модели для пользователя Logstash

В OpenSearch Dashboards перейдите в Security → Roles и создайте роль logstash_writer с разрешениями:

indices:data/write/index
indices:data/write/bulk
indices:admin/create

Последнее — если индексы создаются автоматически.

Во вкладке Index Permissions укажите шаблон индексов:

apache_*

Затем назначьте роль. В Security → Users создайте пользователя logstash и привяжите роль logstash_writer.

Настройка индексных шаблонов

Шаблоны автоматически применяют настройки к новым индексам. Пример для логов Apache (HTTP-запрос через API):

curl -X PUT "https://<opensearch-host>:25060/_index_template/apache_template" \
  -u doadmin:пароль \
  -H 'Content-Type: application/json' \
  -d '{
    "index_patterns": ["apache_*"],
    "template": {
      "settings": {
        "number_of_shards": 2,
        "number_of_replicas": 1
      },
      "mappings": {
        "properties": {
          "response": { "type": "integer" },
          "geo.location": { "type": "geo_point" }
        }
      }
    }
  }'

Проверка:

curl -X GET "https://<opensearch-host>:25060/_index_template/apache_template?pretty" -u doadmin:пароль

Index Lifecycle Management (ILM)

ILM автоматически удаляет старые логи и оптимизирует хранилище.

Создание политики:

curl -X PUT "https://<opensearch-host>:25060/_ilm/policy/apache_policy" \
  -u doadmin:пароль \
  -H 'Content-Type: application/json' \
  -d '{
    "policy": {
      "phases": {
        "hot": {
          "min_age": "0ms",
          "actions": {
            "rollover": {
              "max_size": "50gb"
            }
          }
        },
        "delete": {
          "min_age": "30d",
          "actions": {
            "delete": {}
          }
        }
      }
    }
  }'

Привязка к шаблону:

Обновите индексный шаблон, добавив в settings:

"settings": {
  "index.lifecycle.name": "apache_policy",
  "index.lifecycle.rollover_alias": "apache"
}

Настройка TLS для Logstash

Генерация сертификата:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/logstash/certs/logstash.key \
  -out /etc/logstash/certs/logstash.crt 

Установите сертификат как доверенный в OpenSearch. Для этого загрузите logstash.crt в настройках безопасности кластера (вкладка SSL/TLS Certificates).

Проверьте передачу данных. Поиск событий:

curl -X GET "https://<opensearch-host>:25060/apache_access/_search?q=response:500" \
  -u logstash:пароль_для_logstash

Оптимизация производительности

Уменьшите размер батча в Logstash, если возникают таймауты:

output {  
  opensearch {  
    flush_size => 5000  # Значение по умолчанию 500  
  }  }  

Настройте кеширование DNS. Добавьте в /etc/hosts IP-адреса нод OpenSearch, чтобы избежать задержек.

Запуск и мониторинг

После настройки пайплайна важно обеспечить стабильную работу Logstash и быстро выявлять сбои. Перечисляем ключевые моменты начала работы и настройки наблюдения за системой.

Пробный запуск и отладка

Запустите Logstash вручную для проверки конфигурации:

sudo -u logstash /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/apache.conf --config.reload.automatic

Флаг «--config.reload.automatic» позволит применять изменения конфигов без перезапуска. Если в логах нет ошибок типа Pipeline aborted, переходите к фоновому режиму.

Настройка службы systemd

Создайте файл переопределений для оптимизации ресурсов:

sudo mkdir -p /etc/systemd/system/logstash.service.d/
sudo nano /etc/systemd/system/logstash.service.d/override.conf  

Добавьте параметры:

[Service]
Restart=always
RestartSec=30
MemoryLimit=2G
Environment="LS_JAVA_OPTS=-Xms1g -Xmx1g"  

Перезагрузите службу:

sudo systemctl daemon-reload
sudo systemctl restart logstash  

Мониторинг метрик

Включите экспорт метрик в Prometheus через /etc/logstash/logstash.yml:

http.port: 9600  metrics.exporters:  
  prometheus: { enabled: true, port: 9601 }  

Отслеживайте ключевые показатели в Grafana:

  • Загрузка CPU:
rate(logstash_process_cpu_percent[1m])
  • Потребление памяти:
logstash_jvm_memory_used_bytes
  • Ошибки парсинга:
logstash_pipeline_events_failed

Анализ логов

  • Основные логи:
tail -f /var/log/logstash/logstash-plain.log | grep -E "ERROR|WARN"

Можно заменить tail -f на less +F для постраничного просмотра с возможностью навигации.

  • Dead Letter Queue для диагностики неудачных событий:
/usr/share/logstash/bin/logstash --path.data /tmp/dlq/ -e '
input {
  dead_letter_queue {
    path => "/var/lib/logstash/dead_letter_queue"
  }
}
output {
  stdout {}
}'

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

  • No Living connections. Проверьте доступность OpenSearch и актуальность TLS-сертификатов.
  • Утечки памяти. Ограничьте JVM в /etc/logstash/jvm.options.
  • Зависание пайплайна. Увеличьте request_timeout в настройках вывода.

Заключение

Подводя итог, можно сказать, что связка Apache–Logstash–OpenSearch обеспечивает надёжную основу для централизованного логирования. Логи хранятся в OpenSearch с возможностью быстрого поиска и визуализации, а Logstash обеспечивает гибкость на этапе сбора и обработки — от парсинга до отправки в хранилище.

Читайте в блоге:

Loading spinner
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

VPN на VPS-сервере

Узнайте, как создать собственный VPN на VPS-сервере для защиты ваших конфиденциальных данных!

Что будем искать? Например,VPS-сервер

Мы в социальных сетях