
次のような 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.com
backend1になりますか?
答え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