Search code examples
phpcurlhaproxy

HAProxy health check not working but CURL returns 200 OK


I have a HAProxy health check configured with the following backend:

backend php_servers
   http-request set-header X-Forwarded-Port %[dst_port]
   option httpchk get /health
   http-check expect status 200
   server php1 internal_ip:80 check

HAProxy doesn't enable the server but when using CURL I receive a 200 OK response.

Command: curl -I internal_ip/health
Response:
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 01 Dec 2016 20:53:48 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Access-Control-Allow-Origin: api.flex-appeal.nl
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-transform

Why doesn't HAProxy recognize the servers as "UP"? Seems I can connect just fine.


Solution

  • The correct HTTP verb is GET, not get:

    option httpchk GET /health
    

    You can also check/enable the stats page: on the LastChk column you will see why the check fails. In my case, I get a 501 Not Implemented response.

    I can reproduce it by doing the same request as HAProxy:

    $ telnet localhost 80
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
    get /health HTTP/1.0
    
    HTTP/1.1 501 Not Implemented
    Date: Thu, 01 Dec 2016 21:53:09 GMT
    Server: Apache/2.4.23 (Unix) PHP/7.0.13
    [...]