我想创建一个配置,以便haproxy和后端之间的心跳基于HTTPPOST。
有人知道这件事吗?我尝试了以下配置,但它只向后端服务器发送了http HEAD(我想要http POST(:
backend mlp
mode http
balance roundrobin
server mlp1 192.168.12.165:9210 check
server mlp2 192.168.12.166:9210 check
谢谢你的帮助。
@Mohsin,非常感谢。我确实工作。但我想指定请求消息,似乎我的配置不起作用。如果你也能帮忙的话,我很感激。
[root@LB_vAPP_1tmp]#more/var/www/index.txt
POST / HTTP/1.1rnHost: 176.16.0.8:2234rnContent-Length: 653rnrn<?xml version="1.0" encoding="gb2312"?>rn<svc_init ver="3.2.0">rn<hdr ver="3.2.0">rn<client>rn<id>915948</id>rn<pwd>915948</pwd>rn<serviceid></serviceid>rn</client>rn<requestor><id>13969041845</id></requestor>rn</hdr>rn<slir ver="3.2.0" res_type="SYNC">rn<msids><msid enc="ASC" type="MSISDN">00000000000</msid></msids>rn<eqop>rn<resp_req type="LOW_DELAY"/>rn<hor_acc>200</hor_acc>rn</eqop>rn<geo_info>rn<CoordinateReferenceSystem>rn<Identifier
>rn<code>4326</code>rn<codeSpace>EPSG</codeSpace>rn<edition>6.1</edition>rn</Identifierrn</CoordinateReferenceSystem>rn</geo_info>rn<loc_type type="CURRENT_OR_LAST"/>rn<prio type="HIGH"/>rn</slir>rn</svc_init>rnrnrnrn
我的haproxy.conf文件如下所示:
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local7
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
ulimit-n 65536
daemon
nbproc 1
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
defaults
mode tcp
retries 3
log global
option redispatch
# option abortonclose
retries 3
timeout queue 28s
timeout connect 28s
timeout client 28s
timeout server 28s
timeout check 1s
maxconn 32000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend mlp
mode tcp
option persist
# bind 10.68.97.42:9211 ssl crt /etc/ssl/server.pem
#bind 10.68.97.42:9211
bind 10.68.97.42:9210
default_backend mlp
frontend supl
mode tcp
option persist
bind 10.68.97.42:7275
default_backend supl
#-------------
# option1 http check
#------------
backend mlp
mode http
balance roundrobin
option httpchk POST / HTTP/1.1rnHost: 176.16.0.8:2234rnContent-Length: 653rnrn{<?xml version="1.0" encoding="gb2312"?>rn<svc_init ver="3.2.0">rn<hdr ver="3.2.0">rn<client>rn<id>915948</id>rn<pwd>915948</pwd>rn<serviceid></serviceid>rn</client>rn<requestor><id>13969041845</id></requestor>rn</hdr>rn<slir ver="3.2.0" res_type="SYNC">rn<msids><msid enc="ASC" type="MSISDN">00000000000</msid></msids>rn<eqop>rn<resp_req type="LOW_DELAY"/>rn<hor_acc>200</hor_acc>rn</eqop>rn<geo_info>rn<CoordinateReferenceSystem>rn<Identifier>rn<code>4326</code>rn<codeSpace>EPSG</codeSpace>rn<edition>6.1</edition>rn</Identifier>rn</CoordinateReferenceSystem>rn</geo_info>rn<loc_type type="CURRENT_OR_LAST"/>rn<prio type="HIGH"/>rn</slir>rn</svc_init>rnrnrnrn}
http-check expect rstring <result resid="4">UNKNOWN SUBSCRIBER</result>
server mlp1 192.168.12.165:9210 check
server mlp2 192.168.12.166:9210 check
#server mlp2 192.168.12.166:9210 check
backend supl
mode tcp
source 0.0.0.0 usesrc clientip
balance roundrobin
server supl1 192.168.12.165:7275 check
server supl2 192.168.12.166:7275 check
#server supl2 192.168.12.166:7275 check
@Mohsin,谢谢你的回答,它给了我解决这个问题的关键线索。
然而,我的消息是咆哮的,现在它可以按照我的意愿工作(发送指定的请求并检查指定的响应(。我发布它,希望它也能帮助其他人。一点是,内容的长度非常重要。
后端mlp模式http平衡循环选项httpchk POST/HTTP/1.1\r\n用户代理:HAProxy \r\n主机:176.16.0.8:2234\r\n内容类型:\text/xml\r\n内容长度:516\r\n\r\n9159489159481396904184500000000003200
http-check expect rstring <result resid="4">UNKNOWN SUBSCRIBER</result>
server mlp1 192.168.12.165:9210 check
server mlp2 192.168.12.166:9210 check
经过一点实验,我能够让它发挥作用。
这是我设置的
HAProxy -> NGINX -> Backend
我用tcpdump
探查NGINX阶段的请求,看看实际发生了什么。
为了更改健康检查请求,我们必须遵循文档中描述的黑客攻击来更改HTTP版本并发送标头:
通过使用rn和反斜杠空格将HTTP标头连接起来,可以在字符串之后发送HTTP标头。这对于在探测虚拟主机时发送主机标头非常有用
这是我想发送的原始http检查:
POST ${ENDPOINT} HTTP/1.0
Content-Type: application/json
{"body": "json"}
这里的大问题是HAProxy自己添加了一个新的头:Connection: close
,所以这就是NGINX得到的:
POST ${ENDPOINT} HTTP/1.0
Content-Type: application/json
{"body": "json"}
Connection: close
这导致,至少在我的情况下,由于格式错误的请求而导致错误400s。
修复方法是添加一个Content-Length
标头:
POST ${ENDPOINT} HTTP/1.0
Content-Type: application/json
Content-Length: 16
{"body": "json"}
Connection: close
由于Content-Length
应优先于实际长度,这将强制忽略最后一个标头。这就是NGINX传递给后端的内容:
POST ${ENDPOINT} HTTP/1.0
Host: ~^(.+)$
X-Real-IP: ${IP}
X-Forwarded-For: ${IP}
Connection: close
Content-Length: 16
Content-Type: application/json
{"body": "json"}
这是我的最后一张支票:
option httpchk POST ${ENDPOINT} HTTP/1.0rnContent-Type: application/jsonrnContent-Length: 16rnrn{"body":"json"}
如果只是JSON,您应该可以复制和粘贴它并调整内容长度。然而,我确实建议您遵循相同的过程并探查实际的健康检查,因为由于必须在配置文件中转义字符,因此正确创建请求可能很棘手。
打开haproxy/conf/haproxy.conf文件。转到页面的末尾,您会看到有一行"选项httpchk GET/",将GET更改为POST,您就完成了。
如果你遇到任何问题,请告诉我。