2015-08-03 4 views
2

Я хочу создать такую ​​конфигурацию, чтобы сердцебиение между haproxy и бэкэнд было основано на HTTP POST.haproxy heartbeat с backend на основе http post

Есть ли у кого-нибудь идеи? Я попытался ниже конфигурацию, но только послал HTTP ГОЛОВУ на внутренний сервер (я хочу 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, Большое вам спасибо. Я действительно работаю. Но я хочу указать сообщение с запросом, кажется, моя настройка не работает. Я ценю это, если вы тоже можете помочь.

[корень @ LB_vAPP_1 TMP] # более /var/www/index.txt

POST/HTTP/1.1\r\nHost: 176.16.0.8:2234\r\nContent-Length: 653\r\n\r\n<?xml version=\"1.0\" encoding=\"gb2312\"?>\r\n<svc_init ver=\"3.2.0\">\r\n<hdr ver=\"3.2.0\">\r\n<client>\r\n<id>915948</id>\r\n<pwd>915948</pwd>\r\n<serviceid></serviceid>\r\n</client>\r\n<requestor><id>13969041845</id></requestor>\r\n</hdr>\r\n<slir ver=\"3.2.0\" res_type=\"SYNC\">\r\n<msids><msid enc=\"ASC\" type=\"MSISDN\">00000000000</msid></msids>\r\n<eqop>\r\n<resp_req type=\"LOW_DELAY\"/>\r\n<hor_acc>200</hor_acc>\r\n</eqop>\r\n<geo_info>\r\n<CoordinateReferenceSystem>\r\n<Identifier 
 
>\r\n<code>4326</code>\r\n<codeSpace>EPSG</codeSpace>\r\n<edition>6.1</edition>\r\n</Identifier\r\n</CoordinateReferenceSystem>\r\n</geo_info>\r\n<loc_type type=\"CURRENT_OR_LAST\"/>\r\n<prio type=\"HIGH\"/>\r\n</slir>\r\n</svc_init>\r\n\r\n\r\n\r\n

мой файл 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.1\r\nHost: 176.16.0.8:2234\r\nContent-Length: 653\r\n\r\n{<?xml version=\"1.0\" encoding=\"gb2312\"?>\r\n<svc_init ver=\"3.2.0\">\r\n<hdr ver=\"3.2.0\">\r\n<client>\r\n<id>915948</id>\r\n<pwd>915948</pwd>\r\n<serviceid></serviceid>\r\n</client>\r\n<requestor><id>13969041845</id></requestor>\r\n</hdr>\r\n<slir ver=\"3.2.0\" res_type=\"SYNC\">\r\n<msids><msid enc=\"ASC\" type=\"MSISDN\">00000000000</msid></msids>\r\n<eqop>\r\n<resp_req type=\"LOW_DELAY\"/>\r\n<hor_acc>200</hor_acc>\r\n</eqop>\r\n<geo_info>\r\n<CoordinateReferenceSystem>\r\n<Identifier>\r\n<code>4326</code>\r\n<codeSpace>EPSG</codeSpace>\r\n<edition>6.1</edition>\r\n</Identifier>\r\n</CoordinateReferenceSystem>\r\n</geo_info>\r\n<loc_type type=\"CURRENT_OR_LAST\"/>\r\n<prio type=\"HIGH\"/>\r\n</slir>\r\n</svc_init>\r\n\r\n\r\n\r\n} 
 
    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

ответ

0

Откройте файл haproxy/conf/haproxy.conf. На конце страницы вы увидите, что есть опция «httpchk GET /» в строке «,», «GET to POST», и все готово.

Сообщите мне, если у вас возникнут проблемы.

+0

Hi Mohsin, спасибо за ваш ответ. Но не могли бы вы дать мне более конкретные советы. который GET в haproxy.conf должен быть заменен как POST. Является ли следующая конфигурация: бэкенд MLP режим HTTP баланса roundrobin варианта httpchk ГОЛОВА /index.txt HTTP/1.1 \ г \ п HTTP-проверки ожидать rstring <результата кубовых остатков = \ "4 \"> UNKNOWN ПОДПИСЧИК сервер MLP1 192.168.12.165:9210 check server mlp2 192.168.12.166:9210 check – scany

+0

Большое вам спасибо, я обновил свой вопрос, если это возможно, не могли бы вы помочь мне разобраться? Я хочу указать свой запрос в файле по пути: /var/www/index.txt. Но это не работает. – scany

+0

index.txt недействителен. Вы должны указать URL-адрес сервера, который должен вернуть статус ответа типа 2, например, 200 –

1

@Mohsin, Спасибо за ваш ответ, он дал мне решающий ключ для решения этой проблемы.

Тем не менее, мое сообщение так же ревет, но теперь оно может работать, как я хочу (отправить указанный запрос и проверить указанный ответ). Я размещаю его, надеюсь, это может помочь и другим. Один момент заключается в том, что длина контента очень важна.

бэкенд MLP режим HTTP баланс roundrobin вариант httpchk POST/HTTP/1.1 \ г \ Nuser-Агент: HAProxy \ г \ nHost: 176.16.0.8: 2234 \ г \ nContent-Type: \ Текст/XML \ г \ nContent-Length: 516 \ г \ п \ г \ n91594891594813969041845000000000003200

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 
1

Я был в состоянии получить эту работу после того, как немного поэкспериментировать.

Это была моя установка

HAProxy -> NGINX -> Backend 

Я нюхал запросы на этапе Nginx с tcpdump чтобы увидеть, что на самом деле происходит.

Для того, чтобы изменить запрос на проверку здоровья, мы должны следовать hack в документации, чтобы изменить версию HTTP и отправить заголовки:

можно отправить HTTP-заголовки после строки конкатенации их используя пространства rn и обратную косую черту.Это полезно для отправки заголовков узлов при зондировании виртуального хоста

Это сырье проверка 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.0\r\nContent-Type:\ application/json\r\nContent-Length:\ 16\r\n\r\n{\"body\":\"json\"} 

Если это просто JSON вы должны быть в порядке копирования и вставки этого и регулировать длину содержимого. Тем не менее, я рекомендую вам следовать той же процедуре и проверять фактические проверки работоспособности, потому что с символами, которые нужно выполнить в конфигурационном файле, создание запроса может быть сложным.