
現在、1 台の Web サーバー (10.0.0.77) で複数の仮想ホスト (WordPress サイトと NextCloud インストール) が 1 つの IP アドレスで実行されており、すべてがワイルドカード証明書で保護されています。内部的にも外部的にも問題なく動作しています。
ここで、すべての外部トラフィックを HAproxy 経由でプロキシしたいと思います。以下は、1 つの WordPress サイトと nextcloud 用の簡略化された haproxy 構成です。
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
maxconn 4096
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 15s
timeout client 15s
timeout server 15s
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend localhost80
bind *:80
mode http
redirect scheme https code 301 if !{ ssl_fc }
frontend localhost443
bind *:443
option tcplog
mode tcp
acl tls req.ssl_hello_type 1
tcp-request inspect-delay 5s
tcp-request content accept if tls
acl is_wordpress req.ssl_sni -i nextcloud.domain.com
acl is_nextcloud req.ssl_sni -i wordpress.domain.com
use_backend nextcloud_cluster if is_nextcloud
use_backend wordpress_cluster if is_wordpress
backend wordpress_cluster
mode tcp
option ssl-hello-chk
server is_wordpress 10.0.0.77:443 check
backend nextcloud_cluster
mode tcp
option ssl-hello-chk
server is_nextcloud 10.0.0.77:443 check
問題は、外部トラフィックを haproxy 経由で実行するように再ポイントするとすぐに、たとえば nextcloud.domain.com をロードしようとすると、wordpress.domain.com が取得されることがあり、その逆も同様であることです。
どこが間違っているのか、何かアイデアはありますか?
答え1
SNI を使用してバックエンドを区別する場合、この特定のケースでは非 SNI クライアントはサイトにアクセスできないことに注意する必要があります。
ただし、クライアントがこれで問題なく、同じバックエンドにバランスを取っている場合 (例のように)、構成に冗長な情報が残っています。ここでのよりシンプルなアプローチは次のようになります。
frontend localhost443
bind *:443
option tcplog
mode tcp
default_backend backend1
backend backend1
mode tcp
option ssl-hello-chk
server server1 10.0.0.77:443 check
設定は単純にレイヤー 4 のバランス調整であるため、ランダムな Web サイトが引き続き表示される場合は、10.0.0.77:443 で実行されている Web サーバーをもう少し詳しく調べる必要があります。どの Web サーバーがどのように設定されていて、直接アクセスしたときに同じ問題が発生しますか。