Search code examples
haproxy

HAProxy health check, particularly in mode tcp


I've looked at this previous question HAProxy health check and see that the HAProxy directives have changed significantly in this area. The "monitor" directive seems to be the modern way to do this.

I want to have a proxy running in tcp mode, that's capable of reporting its availability to clients.

I can have a separate listener in http mode, that gives a 200OK response:

frontend  main
    # See "bind" documentation at https://docs.haproxy.org/2.6/configuration.html#4.2-bind
    #   The proxy will listen on all interfaces for connections to the specified port.
    #   Connections MUST use the Proxy Protocol (v1 or v2).
    #   The proxy can ialso Listen on ipv4 and ipv6.
    bind :::5000 accept-proxy
    bind *:5000 accept-proxy

    mode tcp
    # Detailed connection logging
    log global
    option tcplog

    # Only certain hosts (sending MTAs) can use this proxy, enforced via ACL
    acl valid_client_mta_hosts src 127.0.0.1 172.31.25.101
    tcp-request connection reject if !valid_client_mta_hosts
    use_backend out

frontend health_check
    mode http
    bind :::5001
    bind *:5001
    monitor-uri /haproxy_test
    log global # comment this out to omit healthchecks from the logs

however that seems to admit the possibility that 5001 might be up, but there's a problem with 5000.

Is there a way to enable monitoring directly of the mode tcp frontend with recent directives?


Solution

  • Here's a possible workaround:

    Use a client that can add the proxy header, to ping the tcp front-end.

    Make a request toward the proxy health service. The source and dest of the request can be the "loopback" address.

     ./happie 35.90.110.253:5000 127.0.0.1:0 127.0.0.1:5001
    Sending header version 2
    00000000  0d 0a 0d 0a 00 0d 0a 51  55 49 54 0a 21 11 00 0c  |.......QUIT.!...|
    00000010  7f 00 00 01 7f 00 00 01  00 00 13 89              |............|
    
    HTTP/1.1 200 OK
    content-length: 58
    cache-control: no-cache
    content-type: text/html
    
    <html><body><h1>200 OK</h1>
    Service ready.
    </body></html>