Статьи

Мониторинг приложений WordPress с помощью стека ELK

WordPress — это удивительная разработка. Неудивительно, что более четверти всех сайтов на базе CMS используют его . В действительности же сайты WordPress рушатся, как и любой другой сайт. Плохие плагины или темы, вызывающие «экран смерти WordPress» или обновления WordPress на юг, встречаются слишком часто.

Шток фото человека сердитого компьютера

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

Однако в современных условиях эта задача является сложной задачей. В то время как администраторам WordPress, возможно, никогда не понадобится слышать слово «log», веб-разработчикам и командам DevOps, работающим на сайте, часто приходится проходить строки за строками файлов журнала, чтобы понять, что пошло не так.

«Итак, что нового?» — спросите вы. В конце концов, существует множество плагинов WordPress, таких как WP Log Viewer, которые позволяют легко просматривать эти журналы из панели администратора WordPress.

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

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

Чтобы показать пример использования ELK, в этой статье будут рассмотрены этапы создания конвейера журналов из вашего приложения WordPress в стек Logz.io ELK . Вы можете, если хотите, использовать любой экземпляр стека для выполнения точно таких же процедур.

Включение ведения журнала для приложений WordPress

Первый шаг — настроить WordPress для записи логов. Для этого мы собираемся ввести некоторые определения в наш файл wp-config .

Сначала мы изменим значение WP_DEBUG на true :

 define( 'WP_DEBUG', true ); 

Теперь вы начнете видеть ошибки PHP, уведомления и предупреждения, а также сообщения отладки WordPress на страницах вашего приложения.

Далее мы включим функцию регистрации в WordPress:

 define( 'WP_DEBUG_LOG', true ); 

Это сохранит все сообщения об ошибках в файле debug.log расположенном в каталоге /wp-content/ вашего приложения.

Если вы не хотите, чтобы сообщения об ошибках отображались на страницах вашего приложения, используйте WP_DEBUG_DISPLAY — это еще одна константа, которая позволяет вам контролировать показ сообщений WP_DEBUG внутри HTML вашего сайта. Чтобы изменить поведение по умолчанию, отображающее ошибки на экране, измените значение на false чтобы скрыть все сообщения:

 define( 'WP_DEBUG_DISPLAY', false ); 

Еще одна полезная опция — это определение SAVEQUERIES, которое сохраняет запросы к базе данных в массив. Затем вы можете использовать этот массив, чтобы помочь проанализировать проблемы:

 define( 'SAVEQUERIES', true ); 

Каждый запрос будет сохранен вместе с информацией о том, сколько времени потребовался для выполнения запроса, и функцией, которая его вызывала.

Сохраните вашу конфигурацию.

Вы все готово! Чтобы проверить создание файла debug.log , смоделируйте ошибку (вы можете использовать функцию error_log() ), а затем найдите и откройте файл. Если файла нет, вы еще не вызвали ошибку.

Конечно, использование WP_DEBUG не рекомендуется в производственной среде, поэтому будьте осторожны с тем, как вы его используете и какие определения вы используете (например, определение SAVEQUERIES может значительно замедлить ваш сайт).

Доставка бревен в ELK

Теперь, когда мы включили ведение журналов для нашего приложения WordPress, следующим шагом является сбор нового файла журнала и его отправка вместе с журналами Apache в стек ELK для анализа. Для этого мы будем использовать Filebeat, средство доставки журналов от Elastic, которое следит за файлами журналов и отправляет отслеживаемые данные в Logstash или Elasticsearch.

Установка Filebeat

Я использую Ubuntu 14.04 и собираюсь установить Filebeat из репозитория (если вы используете другую ОС, здесь приведены дополнительные инструкции по установке ).

Сначала я собираюсь скачать и установить открытый ключ подписи:

 curl https://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add - 

Далее я собираюсь сохранить определение репозитория в /etc/apt/sources.list.d/beats.list :

 echo "deb https://packages.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources.list.d/beats.list 

Наконец, я собираюсь запустить apt-get update и установить Filebeat:

 sudo apt-get update && sudo apt-get install filebeat 

Logz.io использует TLS в качестве дополнительного уровня безопасности, поэтому следующим шагом перед настройкой конвейера данных является загрузка сертификата и его перемещение в правильное местоположение:

 wget http://raw.githubusercontent.com/cloudflare/cfssl_trust/master/intermediate_ca/COMODORSADomainValidationSecureServerCA.crt sudo mkdir -p /etc/pki/tls/certs sudo cp COMODORSADomainValidationSecureServerCA.crt /etc/pki/tls/certs/ 

Настройка Filebeat

Нашим следующим шагом будет открытие файла конфигурации Filebeat в /etc/filebeat/filebeat.yml и настройка Filebeat для отслеживания определенных файлов журнала и вывода их в экземпляр Logzash Logz.io.

В разделе Prospectors мы определим файлы, к которым мы хотим привязать Filebeat: в этом случае наши файлы журнала Apache ( /var/log/apache2/*.log ), а также файл отладки WordPress ( /var/www/html/wordpress/wp-content/debug.log ). Если вы используете Nginx, измените соответственно.

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

Мы также добавим некоторые дополнительные поля, специфичные для Logz.io (кодек и токен пользователя) для каждого исследователя.

Конфигурация выглядит следующим образом:

 ################### Filebeat Configuration Example ######################### ############################# Filebeat ##################################### filebeat: # List of prospectors to fetch data. prospectors: # This is a text lines files harvesting definition - paths: - /var/www/html/wordpress/wp-content/debug.log fields: logzio_codec: plain token: tWMKrePSAcfaBSTPKLZeEXGCeiVMpuHb fields_under_root: true ignore_older: 24h document_type: WP - paths: - /var/log/apache2/*.log fields: logzio_codec: plain token: tWMKrePSAcfaBSTPKLZeEXGCeiVMpuHb fields_under_root: true ignore_older: 24h document_type: apache registry_file: /var/lib/filebeat/registry 

Далее в разделе «Вывод» файла конфигурации мы определим хост Logzash Logz.io ( listener.logz.io:5015 ) в качестве места назначения вывода для наших журналов и расположение сертификата TLS, используемого для аутентификации.

 ############################# Output ######################################## # Configure what outputs to use when sending the data collected by the beat. output: logstash: # The Logstash hosts hosts: ["listener.logz.io:5015"] tls: # List of root certificates for HTTPS server verifications Certificate_authorities: ['/etc/pki/tls/certs/COMODORSADomainValidationSecureServerCA.crt'] 

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

 Output: logstash: hosts: ["localhost:5044"] elasticsearch: hosts: ["localhost:9200"] 

Сохраните свою конфигурацию Filebeat.

Настройка Logstash

Logstash, компонент в стеке, отвечающий за анализ журналов перед их пересылкой в ​​Elasticsearch, может быть настроен на манипулирование данными, чтобы сделать журналы более удобочитаемыми и легко анализируемыми.

В нашем случае мы будем использовать плагин grok для разбора наших логов WordPress. Теперь, если мы используем Logz.io, о гроккингах позаботятся о нас. Но если вы используете ELK с открытым исходным кодом, просто примените следующую конфигурацию непосредственно к вашему файлу конфигурации /etc/logstash/conf.d/xxxx.conf ( /etc/logstash/conf.d/xxxx.conf ):

 if [type] == "WP" { grok { match => [ "message", "\[%{MONTHDAY:day}-%{MONTH:month}-%{YEAR:year} %{TIME:time} %{WORD:zone}\] PHP %{DATA:level}\: %{GREEDYDATA:error}" ] } mutate { add_field => [ "timestamp", "%{year}-%{month}-%{day} %{time}" ] remove_field => [ "zone", "month", "day", "time" ,"year"] } date { match => [ "timestamp" , "yyyy-MMM-dd HH:mm:ss" ] remove_field => [ "timestamp" ] } } 

Проверка конвейера

Пришло время убедиться, что конвейер журналов в ELK работает как положено.

Во-первых, убедитесь, что Filebeat работает:

 cd /etc/init.d ./filebeat status 

И если нет, введите:

 sudo ./filebeat start 

Затем откройте Kibana (интегрирован в пользовательский интерфейс Logz.io). Журналы Apache и ошибки WordPress начнут появляться в главной области экрана.

Логи отображаются в Кибане

Анализировать логи

ELK предназначен для больших данных. Таким образом, платформа позволяет просеивать большие объемы поступающих сообщений, запрашивая компонент хранилища стека — Elasticsearch.

Чтобы разобраться в данных, выберите одно из сообщений в основной области дисплея — это даст вам представление о том, какая информация доступна. Помните другой тип, который мы определили для поисковиков Filebeat? Чтобы сделать этот список сообщений более понятным, выберите поля type , response , level и error из списка отображенных полей слева.

Анализ бревен в Кибане

Теперь предположим, что вы хотите отфильтровать результаты, чтобы видеть только сообщения, поступающие из файла debug.log WordPress. Есть несколько способов сделать это, самый простой из которых — ввести следующий запрос на уровне поля в поле запроса Kibana в верхней части страницы:

 type:WP 

WordPress логи в Кибане

Снова откройте одно из сообщений и просмотрите информацию, которая была отправлена ​​в систему. Вот пример ошибки базы данных, записанной PHP в файл debug.log и перенаправленной в стек ELK:

[01-Jun-2016 14:03:11 UTC] PHP Warning: mysqli_real_connect(): (28000/1045): Access denied for user 'ro'@'localhost' (using password: YES) in /var/www/html/wordpress/wp-includes/wp-db.php on line 1490

Сохранить поиск. Мы будем использовать его для создания визуализации на следующем шаге.

Визуализация журналов

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

Выберите вкладку «Визуализация» в Kibana и выберите из списка доступных визуализаций тип визуализации «Круговая диаграмма».

Далее выберите создание визуализации на основе нашего сохраненного поиска выше и настройте ее следующим образом:

Конфигурация типов сообщений

Мы используем простое объединение терминов, используя поле level чтобы показать счетчик для 5 основных типов ошибок. Нажмите зеленую кнопку Play, чтобы увидеть предварительный просмотр визуализации:

Визуализация типов сообщений

Это простой пример того, как ваши данные журнала WordPress могут быть визуализированы в Kibana. То же самое относится к вашим журналам Apache и любому другому источнику данных, который вы конфигурируете для интеграции с ELK, и, когда у вас есть серия визуализаций для мониторинга вашего приложения WordPress, вы можете добавить их, чтобы создать панель мониторинга, дающую вам общий обзор вашей среды. ,

Написание пользовательских журналов

Другой вариант — записать свои собственные журналы в файл журнала.

Разработка на основе журналов (LDD) — это методология разработки, включенная в культуру DevOps, которая основана на том, что разработчики пишут и отслеживают журналы как неотъемлемую часть своего процесса разработки.

Используя функцию error_log() , вы можете записать пользовательские сообщения в файл журнала WordPress для последующего использования в ELK. Примерами использования этой функции могут быть наблюдения за чтением определенной строки кода или даже при посещении определенной страницы.

Финальная нота

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

Хотя WordPress поддерживает различные подключаемые модули ведения журналов, ни один из них не позволяет сопоставлять журналы с дополнительными источниками данных, такими как веб-сервер, база данных или балансировщик нагрузки. Централизованное ведение журнала с помощью ELK позволяет вам делать это вместе с возможностью анализа данных и создания панелей мониторинга, которые помогут вам визуализировать их.