HAProxy에서 SNI를 기반으로 특정 라우팅을 강제하는 방법은 무엇입니까?

HAProxy에서 SNI를 기반으로 특정 라우팅을 강제하는 방법은 무엇입니까?

다음과 같은 HAProxy 구성이 있습니다.

listen sni-443
    bind *:443
    mode tcp

    timeout connect  4s
    timeout client   3m
    timeout server   3m
    tcp-request inspect-delay 5s
    tcp-request content accept if { req.ssl_hello_type 1 }
    acl no-ssl req.ssl_hello_type 0

    use-server backend1.default.svc.cluster.local if !no-ssl { req_ssl_sni -i www.example.com }
    server  backend1.default.svc.cluster.local  10.96.245.95:443 weight 0

    use-server backend2.default.svc.cluster.local if !no-ssl { req_ssl_sni -i demo.example.com }
    server  backend2.default.svc.cluster.local  10.96.184.199:443 weight 0

방문하면 www.example.com모든 것이 괜찮습니다. 그러나 높은 빈도로 다시 로드한 후(브라우저에서 Shift-Ctrl-R을 누르는 경우) 그렇게 하면 demo.example.com결국 demo.example.com. 예, 정확합니다. www.example.com브라우저에서 열었 지만 HAProxy가 이를 backend2로 라우팅합니다(오류를 반환함).

분명히 HAProxy는 두 서비스가 로드 밸런싱을 위한 대안이 아니라 매우 별개의 제품이라는 점을 완전히 이해하지 못합니다. 내가 어떻게 할 수있는보장하다그게 www.example.combackend1로 끝나나요?

답변1

이것은 다음 문서의 예입니다 req_ssl_sni.

tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend bk_allow if { req_ssl_sni -f allowed_sites }
default_backend bk_sorry_page

무언가를 설정 해야 할 수도 있습니다 tcp-request inspect-delay. 설정하지 않으면 haproxy가 전혀 기다리지 않고 SNI가 무엇인지 전혀 알 수 없기 때문입니다.
자세한 설명은에 대한 문서tcp-request inspect-delay

관련 정보