如何创建将通过运行bash脚本并返回输出来响应HTTP请求的服务?

时间:2018-12-31 12:32:27

标签: bash http ubuntu xinetd

我在MySQL组复制设置之前有一个DO负载平衡器设置。我需要做的是通过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
}

重击(在线找到)

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请求的方式。

2 个答案:

答案 0 :(得分:0)

xinetd侦听网络上的传入请求,并为该请求启动适当的服务。使用端口号作为标识符发出请求,xinetd通常会启动另一个守护程序来处理请求。

在这种情况下,您正在启动脚本。确保其可执行文件,具有正确的权限并添加相应的shebang

#! /bin/bash

然后尝试

telnet ip 9201

答案 1 :(得分:0)

如果在输出中得到太多的LF字符,则将echo -e的出现更改为echo -ne(或从每一行的末尾删除\n)。

您可能还需要在输出中添加正确的Content-Length:标头。

还要确保脚本可以在不依赖任何环境变量的情况下运行,例如$PATH

我使用这些函数在脚本中返回OK或FAIL响应:

return_ok()
{
    echo -ne "HTTP/1.1 200 OK\r\n"
    echo -ne "Content-Type: text/html\r\n"
    echo -ne "Content-Length: 47\r\n"
    echo -ne "\r\n"
    echo -ne "<html><body>MySQL is running.</body></html>\r\n"
    echo -ne "\r\n"
    exit 0
}

return_fail()
{
    echo -ne "HTTP/1.1 503 Service Unavailable\r\n"
    echo -ne "Content-Type: text/html\r\n"
    echo -ne "Content-Length: 46\r\n"
    echo -ne "\r\n"
    echo -ne "<html><body>MySQL is *down*.</body></html>\r\n"
    echo -ne "\r\n"
    exit 1
}