Проверка здоровья с xinetd – Сброс соединения соперником

Вопрос или проблема

Я пытаюсь настроить простой healthcheck с использованием xinetd. У меня возникают проблемы, когда я вызываю его через wget / curl.

Если я вызываю bash-скрипт .mysqlchk, я получаю ожидаемый ответ, но при использовании wget http://0.0.0.0:5050 я получаю следующую ошибку:

--2024-10-29 12:04:49--  (попытка: 2)  http://0.0.0.0:5050/
Подключение к 0.0.0.0:5050... подключено.
HTTP-запрос отправлен, ожидаем ответа... Ошибка чтения (Соединение сброшено удаленным хостом) в заголовках.
Повторная попытка.
service mysqlchk
{
        flags           = REUSE
        socket_type     = stream
        port            = 5050
        wait            = no
        user            = nobody
        server          = /usr/local/sbin/mysqlchk
        disable         = no
        only_from       = 127.0.0.1
        per_source      = UNLIMITED 
}

/usr/local/sbin/mysqlchk:

return_ok()
{
    MESSAGE="<html><body>MySQL backends are running.</body></html>\r\n"
    length=$(( ${#message} + 2 ))
    echo -en "HTTP/1.0 200 OK\r\n"
    echo -en "Content-Type: text/html\r\n"
    echo -en "Content-Length: ${length}\r\n"
    echo -en "\r\n"
    echo -en "${#message}"
    echo -en "\r\n"
    sleep 0.1
    exit 0
}
return_ok

Ответ или решение

Проблема со здоровьем с использованием xinetd: "Connection Reset by Peer"

Введение

В данном ответе мы рассмотрим ситуацию, связанную с настройкой простого healthcheck с использованием xinetd, где при обращении к скрипту через wget или curl возникает ошибка "Connection reset by peer". Мы проанализируем возможные причины этой проблемы и предложим решения.

Описание проблемы

При вызове bash-скрипта /usr/local/sbin/mysqlchk ожидаемый ответ получен, однако при обращении к адресу http://0.0.0.0:5050 с помощью команды wget или curl наблюдается ошибка:

Read error (Connection reset by peer) in headers.

Настройка xinetd

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

service mysqlchk
{
        flags           = REUSE
        socket_type     = stream
        port            = 5050
        wait            = no
        user            = nobody
        server          = /usr/local/sbin/mysqlchk
        disable         = no
        only_from       = 127.0.0.1
        per_source      = UNLIMITED 
}

Здесь указано, что серверный скрипт будет запущен в контексте пользователя nobody, и что доступ к службе разрешен только с localhost (127.0.0.1).

Анализ скрипта mysqlchk

Скрипт mysqlchk определяет функцию return_ok, которая отвечает за формирование HTTP-ответа. Однако при проверке кода можно заметить следующие недостатки:

  1. Неверное использование переменной MESSAGE – в строке:

    MESSAGE="&lt;html&gt;&lt;body&gt;MySQL backends are running.&lt;/body&gt;&lt;/html&gt;\r\n"

    содержимое переменной MESSAGE не используется при формировании ответа, вместо этого выводится длина переменной #message, которая всегда равна 0.

  2. Форматирование ответа – код должен отправлять содержимое переменной MESSAGE в конце, а не её длину.

  3. Излишний sleep – использование sleep 0.1 может вызвать проблемы, если запрашивается сразу несколько соединений.

Рекомендации по исправлению

Исправление кода скрипта

Измените скрипт mysqlchk следующим образом:

return_ok()
{
    MESSAGE="<html><body>MySQL backends are running.</body></html>\r\n"
    length=${#MESSAGE}
    echo -en "HTTP/1.0 200 OK\r\n"
    echo -en "Content-Type: text/html\r\n"
    echo -en "Content-Length: ${length}\r\n"
    echo -en "\r\n"
    echo -en "${MESSAGE}"  # Исправлено на вывод сообщения
    exit 0
}
return_ok
Убедитесь, что xinetd работает корректно

Проверьте, что xinetd запущен и прослушивает указанный порт:

sudo netstat -tuln | grep 5050

Если службы нет в списке, возможно, необходимо перезапустить xinetd:

sudo service xinetd restart
Тестирование

Теперь протестируйте доступность скрипта через wget или curl:

curl http://127.0.0.1:5050

Заключение

Следуя приведенным рекомендациям, вы сможете устранить ошибку "Connection reset by peer" и настроить правильный healthcheck с использованием xinetd. Обязательно проверьте, что ваш скрипт корректно формирует HTTP-ответ и соблюдает стандарты. Правильная реализация позволит вам эффективно мониторить состояние MySQL-сервера и своевременно реагировать на возможные сбои.

Оцените материал
Добавить комментарий

Капча загружается...