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

В мире веб-разработки и системного администрирования логи — это ключи к пониманию работы приложений, диагностике ошибок и даже прогнозированию угроз. Apache, один из самых распространённых веб-серверов, генерирует огромные объёмы данных: каждый запрос, каждый сбой, каждое обращение к ресурсу фиксируется в access- и error-логах. Но необработанные raw-данные без структуры почти бесполезны — важно видеть картину целиком.
Именно здесь на сцену выходит связка Logstash и OpenSearch. Logstash выступает в роли «мозга», преобразующего сырые логи в структурированные события, а OpenSearch становится надёжным хранилищем, где данные можно мгновенно находить, фильтровать и изучать через интуитивные дашборды.
Рассмотрим настройку передачи журналов из Apache в OpenSearch через Logstash — как правило, на выделенном сервере или VPS. Вы узнаете, как избежать типичных ошибок при парсинге сложных форматов, как защитить канал передачи данных и как оптимизировать производительность Logstash под высокие нагрузки.
Подготовка инфраструктуры
Прежде чем настраивать передачу журналов веб-сервера, убедитесь, что все компоненты системы готовы к интеграции. Не пропускайте этап подготовки, чтобы не столкнуться с ошибками вроде «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 — гибкий инструмент для перекачки данных. Он позволяет адаптировать сбор и обработку логов под любые сценарии, но для этого требуется корректная установка и тонкая настройка.
Если вы используете кастомные сборки Java или нестандартные версии Ruby, выбирайте установку через Docker — это избавит от конфликтов зависимостей.
Процесс установки:
- Предварительно обновите установленное ПО, чтобы избежать конфликтов.
- Добавление репозитория 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
- Установка 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 обеспечивает гибкость на этапе сбора и обработки — от парсинга до отправки в хранилище.
Читайте в блоге:
- Что такое Apache Tomcat: простое руководство для начинающих
- Как защитить Apache с помощью Let's Encrypt в Ubuntu 20.04 и 22.04
- Установка Java на Ubuntu 22.04 через Apt: полное руководство
- Настройка VPS на Debian 11: пошаговое руководство
- Как интегрировать OpenCart с «1С» через VPS: пошаговая инструкция