Вопрос или проблема
Я пытаюсь настроить простой 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-ответа. Однако при проверке кода можно заметить следующие недостатки:
-
Неверное использование переменной MESSAGE – в строке:
MESSAGE="<html><body>MySQL backends are running.</body></html>\r\n"
содержимое переменной
MESSAGE
не используется при формировании ответа, вместо этого выводится длина переменной#message
, которая всегда равна0
. -
Форматирование ответа – код должен отправлять содержимое переменной
MESSAGE
в конце, а не её длину. -
Излишний 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-сервера и своевременно реагировать на возможные сбои.