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は、この2つのサービスが負荷分散の代替ではなく、まったく異なる製品であることを十分に理解していないようです。どうすれば確保するそれは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

関連情報