Рубрики
Uncategorized

Как построить конвейер регистрации для Nginx Server

Фон Nginx является одним из наиболее широко используемых веб -сервера, который также можно использовать в качестве Reve … Tagged с DevOps, ShowDev, Nginx, журнал.

Nginx является одним из наиболее широко используемых веб -сервера, который также может использоваться в качестве обратного прокси, балансировщика нагрузки, почтового прокси и HTTP Cache. По умолчанию nginx записывает журналы в /var/log/nginx/access.log в простом текстовом формате, как это:

157.245.235.57 - [04/Aug/2020:21:16:03 +0000] "POST /api/ HTTP/1.1" 200 457 13 "-" "Vector/0.10.0 (g0f0311a x86_64-unknown-linux-gnu 2020-07-22)" 0.002 0.000 25f146d2aaee0d50f35c4404c9bb1f12
114.227.157.172 - [04/Aug/2020:21:16:11 +0000] "GET /phpmyadmin/ HTTP/1.1" 404 199 580 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" 0.000 - eb3c6c45f70e9bf7e562956c00a42970
195.54.160.21 - [04/Aug/2020:20:31:07 +0000] "GET /vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1" 404 284 209 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" 0.181 - 7455ea5f3bc5512ab544b068600041bc

Журналы NGINX содержат информацию, такую как задержку запроса, запрос IP и и т. Д., Которые очень полезны для мониторинга системы здоровья. Но они будут еще более полезны, если они могут быть в более структурированном формате. Чтобы преобразовать журналы в полезную статистику, нам понадобится конвейер журналов для обработки данных журнала, Преобразование их в структурированные данные, которые могут быть легко агрегированы, а затем маршрут им для аналитических инструментов.

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

Мы пройдем через то, как создать трубопровод журналов, используя SignalFlex Анкет

SignalFlex является разборчивым конвейером. Он может получать любые произвольные данные журнала с конечных точек HTTP. И это позволяет нам настроить логику преобразования и обработки без написания кода. После получения данных SignalFlex преобразует их в структурированные события и пересылайте их в инструменты управления журналом и мониторинг (DataDog, Elasticsearch и т. Д.). Мы будем использовать SignalFlex для создания конвейера журнала для обработки наших журналов NGINX и отправки структурированных данных в HoneyComb.

  • Событие журнала преобразования

Журналы Nginx — это необработанный текст и не имеют структуры:

157.245.235.57 - [04/Aug/2020:21:16:03 +0000] "POST /api/ HTTP/1.1" 200 457 13 "-" "Vector/0.10.0 (g0f0311a x86_64-unknown-linux-gnu 2020-07-22)" 0.002 0.000 25f146d2aaee0d50f35c4404c9bb1f12

Нам понадобится разобрать их в некоторые структурированные данные, такие как следующие:

{
    "ip_address": "157.245.235.57",
    "status": "400",
    "path": "POST /api/ HTTP/1.1"
    ...
}

Первым шагом является использование анализа REGEX, чтобы извлечь эти пары значений из необработанного журнала. Мы будем использовать шаблон режима:

^(?P[\w\.]+) - \[(?P

Этот шаблон режима вытягивает пару значений ключей из каждой строки журнала. Мы будем использовать этот шаблон режима для настройки Преобразование regex signalflex :

SignalFlex позволяет легко определить логику преобразования. Вы можете проверить преобразование с помощью примеров данных журнала. После преобразования анализатора режима режима, событие журнала Nginx будет структурированным JSON, как следующее:

{
    "_message": "157.245.235.57 - [04/Aug/2020:21:22:00 +0000] \"POST /api/ HTTP/1.1\" 200 457 13 \"-\" \"Vector/0.10.0 (g0f0311a x86_64-unknown-linux-gnu 2020-07-22)\" 0.002 0.000 d88709e784d32b83783838ce67cefd16",
    "agent": "Vector/0.10.0 (g0f0311a x86_64-unknown-linux-gnu 2020-07-22)",
    "bytes_out": "13",
    "http_version": "1.1",
    "ip": "157.245.235.57",
    "method": "POST",
    "path": "/api/",
    "referer": "-",
    "request_id": "d88709e784d32b83783838ce67cefd16",
    "request_length": "457",
    "request_time": "0.002",
    "scheme": "HTTP",
    "status": "200",
    "time": "04/Aug/2020:21:22:00 +0000",
    "upstream_response_time": "0.000"
  }

Мы заметим, что значения request_length , request_time и upstream_response_time это строка, нам нужно преобразовать их в число, чтобы они могли агрегировать. Мы можем добавить SignalFlex JavaScript Transform Чтобы преобразовать эти значения в числа.

После применения REGEX и JS Transform наше событие журнала будет выглядеть следующим образом со значениями request_length В request_time и upstream_response_time преобразовано в числа

{
    "_message": "157.245.235.57 - [04/Aug/2020:21:22:00 +0000] \"POST /api/ HTTP/1.1\" 200 457 13 \"-\" \"Vector/0.10.0 (g0f0311a x86_64-unknown-linux-gnu 2020-07-22)\" 0.002 0.000 d88709e784d32b83783838ce67cefd16",
    "agent": "Vector/0.10.0 (g0f0311a x86_64-unknown-linux-gnu 2020-07-22)",
    "bytes_out": "13",
    "http_version": "1.1",
    "ip": "157.245.235.57",
    "method": "POST",
    "path": "/api/",
    "referer": "-",
    "request_id": "d88709e784d32b83783838ce67cefd16",
    "request_length": 457,
    "request_time": 0.002,
    "scheme": "HTTP",
    "status": "200",
    "time": "04/Aug/2020:21:22:00 +0000",
    "upstream_response_time": 0.000
  }
  • Данные маршрута к сотовым

Теперь у нас есть структурированные события журнала, мы можем отправить их в Honeycomb, где мы будем собирать эти события и отслеживать нашу сервис Nginx.

Мы можем настроить наш набор данных Honeycomb и ключ API на SignalFlex.

  • Отправить данные в трубопровод

Теперь, когда конвейер Log готов на SignalFlex, мы можем начать отправлять в него журналы.

Чтобы собрать журналы nginx ( /var/log/nginx/access.log ) и отправить в SignalFlex, мы можем использовать легкий грузовой грузовик с именем Вектор . Он сканирует файл журнала Nginx и отправит журналы в наш трубопровод SignalFlex.

  • Установить вектор.
$curl --proto '=https' --tlsv1.2 -sSf [https://sh.vector.dev](https://sh.vector.dev/) | sh
  • Создайте векторный файл конфигурации /etc/vector/nginx.toml
data_dir = "/var/lib/vector"

[sources.in]
  type = "file"
  include = ["/var/log/nginx/access.log"]

# Output data
[sinks.signalflex]
  inputs   = ["in"]
  type     = "http"
  encoding.codec = "text"
  headers.pipeline = "${pipeline_id}"
  headers.api_key = "${api_key}"
  uri = "https://alpha.signalflex.io/api/"

  request.timeout_secs = 1000

Заменим Pipeline_id и api_key с реальными значениями, которые можно найти в настройках SignalFlex

  • Начать вектор
$vector —config /etc/vector/nginx.toml

Мы можем проверить, что данные журнала проходят в SignalFlex, посмотрев на панель трубопроводов

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

  • Просмотреть среднюю задержку запроса Nginx

  • Просмотреть распределение задержки запроса Как мы видим, запросы внутри желтого прямоугольника — это запросы выбросов, которые имеют более высокую задержку, чем остальные запросы. Мы можем использовать функцию Bubble Up Honeycomb, чтобы найти возможную причину, которая вызывает высокую задержку.

  • Пузырьте задержку запроса и длину запроса Результат Bubble UP показывает, что выбросы, которые имеют высокую задержку, также имеют большую длину запроса. Поэтому очевидно, что большая длина запроса вызывает высокую задержку запроса.

В этом посте мы прошли через то, как использовать SignalFlex в качестве конвейера журнала для обработки журналов Nginx и отправки данных в Honeycomb, где мы можем анализировать и контролировать состояние системы. SignalFlex снимает ваше бремя управления и масштабирования вашего собственного трубопровода. И это позволяет вам определить логику сложного преобразования для вашего потока событий и поддерживает отправку данных в различные инструменты журнала и метрики. Если это вас интересует, присоединяйтесь к список ожидания !

Оригинал: «https://dev.to/sethwxh/build-a-logging-pipeline-for-nginx-server-in-5-mins-59fh»