Как создать службу, которая будет отвечать на запрос HTTP, запустив сценарий bash и вернув выходные данные? - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть настройка балансировки нагрузки DO перед настройкой MySQL Group Replication.Что мне нужно сделать, это создать проверку работоспособности для loadbalancer через HTTP-запрос.

Пока я придумал создать сценарий bash (код ниже), который в основном проверяет, работает ли MySQL, а затем запускает его через xinetd на порту 9201.

Тем не менее, когда я переключаюсь на http://ip:port с другого сервера, он никогда не читает никаких выходных данных из моего bash-файла и просто сбрасывает соединение по одноранговой сети (после подключения и тайм-аута).

Я очень новичок ввсе это, так что я не уверен, что то, что я делаю, хоть немного верно.

service mysqlchk
{ 
        flags           = REUSE
        socket_type     = stream
        protocol        = tcp
        port            = 9201
        wait            = no
        user            = root
        server          = /opt/mysqlchk.sh
        disable         = no
        log_type        = FILE /var/log/xinetd.log
        log_on_success  = DURATION EXIT HOST PID USERID
        log_on_failure  = ATTEMPT HOST USERID
        only_from       = 0.0.0.0/0
}

Bash (найдено в Интернете)

MYSQL_HOST="ip"
MYSQL_PORT="3306"
MYSQL_USERNAME="user"
MYSQL_PASSWORD="=password"

#
# We perform a simple query that should return a few results :-p

ERROR_MSG=`/usr/bin/mysql --host=$MYSQL_HOST --port=$MYSQL_PORT -- 
user=$MYSQL_USERNAME --password=$MYSQL_PASSWORD -e "show databases;" 
2>/dev/null`

#
# Check the output. If it is not empty then everything is fine and we 
return
# something. Else, we just do not return anything.
#
if [ "$ERROR_MSG" != "" ]
then
        # mysql is fine, return http 200
        /bin/echo -e "HTTP/1.1 200 OK\r\n"
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n"
        /bin/echo -e "\r\n"
        /bin/echo -e "MySQL is running.\r\n"
        /bin/echo -e "\r\n"
else
        # mysql is not fine, return http 503
        /bin/echo -e  "HTTP/1.1 503 Service Unavailable\r\n"
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n"
        /bin/echo -e "\r\n"
        /bin/echo -e "MySQL is *down*.\r\n"
        /bin/echo -e "\r\n"
fi

Что возвращается при скручивании:

curl -v http://ip:9201/
*   Trying ip...
* TCP_NODELAY set
* Connected to ip (ip) port 9201 (#0)
> GET / HTTP/1.1
> Host: ip:9201
> User-Agent: curl/7.58.0
> Accept: */*
> 
* Recv failure: Connection reset by peer
* stopped the pause stream!
* Closing connection 0
curl: (56) Recv failure: Connection reset by peer

Я не уверен, что проблема в том, что я 'м просто неправильно отвечает на запрос или?

РЕДАКТИРОВАТЬ: Запуск сценария bash вручную возвращает правильный вывод в зависимости от того, может ли он подключиться или нет.Я не думаю, что в самом bash есть синтаксическая ошибка, просто то, как она отвечает на запрос http.

1 Ответ

0 голосов
/ 31 декабря 2018

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

В вашем случае вы запускаете скрипт.Убедитесь, что он исполняемый, имейте правильное разрешение и добавьте соответствующий shebang

#! /bin/bash

Затем попробуйте

telnet ip 9201
...