Hello !
I used haproxy version 1.8.8
I have backend is multi-servers, but some server use proxy server. It use only one public IP to the internet but mapping by domain (same virtual-host). All backend servers is same all mandates, functions …
I have diagram:
Clients --> Haproxy-Server ---> Server 1 ( have IP: xxx.yyy.zzz.kkk domain: testhaproxy1.com )
---> Server 2 ( have IP: aaa.bbb.ccc.ddd domain: testhaproxy2.com )
---> Server 3 ( have IP: aaa.bbb.ccc.ddd domain: testhaproxy3.com - same IP with server 2 )
---> Server 4 ( have IP: aaa.bbb.ccc.ddd domain: testhaproxy4.com- same IP with server 2 )
My current haproxy.cfg
frontend http-in
bind *:80
mode http
use_backend bke_servers
backend bke_servers
balance roundrobin
option forwardfor
option external-check
external-check path "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
external-check command "/var/lib/haproxy/loadbalancer"
default-server inter 15s downinter 5s fall 3 rise 2
#http-send-name-header Host
server server1 testhaproxy1.com:80 check weight 20
server server2 testhaproxy2.com:80 check weight 20
server server3 testhaproxy3.com:80 check weight 30
server server4 testhaproxy4.com:80 check weight 30
Proplem:
1/ When I use check health by httpchk GET - server 2,3,4, the haproxy check always send request to their IP. So, it failed. I need write the shell script to check by external-check ( if server name is server1 --> send request check to testhaproxy1.com --> if ok exit 1 else exit -1).
2/ When I tried send request to proxy server - I got failed results, it return code status 502 Bad Gateway. And I tried to check root problem is haproxy always send request to IP - not to domain of each servers.
I tried to use http-request set-header Host - but it only used for only one server. I don’t know:
How to I can set Host same: http-request set-header Host testhaproxy1.com if { server_name server1 }
Or How to: I can configuration haproxy send request exactly to domain - not to IP ?
You are load-balancing via round-robin between those 4 servers, they are supposed to serve the same domains, so why don’t you send the same health-check domain to all of them.
Check the docs to know howto send specific host headers in health checks:
Hi lukastribus
Maybe, you do not understand exactly my case. Other, I have not only 4 servers backend - it is many servers (more than 10 servers, and have some servers have same public internet IP ) and server run HAProxy is Independent server. Please read again my problem.
I will detail more: when I used httpchk-check
backend bke_allservers
balance roundrobin
option forwardfor
option httpchk HEAD /api/v1/rest/serverstatus
http-check expect status 200
default-server inter 10s fall 3 rise 2
server server1 testhaproxy1.com:80 check
server server2 testhaproxy2.com:80 check
server server3 testhaproxy3.com:80 check
.....
server serverN testhaproxyn.com:80 check
As you know, when you used VPS on one main physical server ( physical server public only one IP to the internet) each VPS will distinguished through domain mapping. (example: testhaproxy2.com mapping with VPS2, testhaproxy3.com mapping with VPS3 ). So, all domains mapped on this physical server will used only one public IP. Wen you use command ping to them - it only return one IP. Example public IP is: 123.12.123.123, on this case when you run command: curl -s -k http://testhaproxy1.com/api/v1/rest/serverstatus ==> the result will return ok and head status is 200
But: curl -s -k http://123.12.123.123/api/v1/rest/serverstatus ==> the result will return Bad Gateway and head status is 404
So, I got problem - HAProxy always send request check for IP of each domain - not send to domain.
And same with case health-check when I send request to HAProxy-server - it will call backend but sent this request to IP of each server. Detail: I see on HAProxy log - it print server [06/Aug/2019:03:37:17.175] http-in~ bke_allservers/server3 - and return status 404 - Not Found. And I get apache access_log of physical server this request (check host is IP not domain). So, this request can not send to VPS-3