用語辞典・サーバー・Web運営

バーチャルホスト

バーチャルホストとは

バーチャルホストは、一台のWebサーバーで、ホスト名などに応じて複数サイトを分けて公開する設定です。英語ではvirtual host(バーチャル・ホスト)と表します。

一つのIPアドレスへ複数ドメインを向けても、HTTPのHostヘッダーやTLSのSNIを手掛かりに、別々の文書ルート、証明書、ログ、アクセス方針を選べます。

DNSは利用者をサーバーのアドレスまで案内します。到着した要求をどのサイト設定で処理するかはWebサーバーが決めます。

同じ接続先へ到着した複数ホスト名を、SNIとHostから別の公開区画へ振り分けるDNSのアドレス選択とWebサーバー内のサイト選択を分ける
複数のドメインが同じサーバーアドレスへ到着し、TLSのSNIとHTTP Hostにより異なる証明書、文書ルート、ログの区画へ分かれるピクトグラム図解
図1一致しないホスト名をどの既定サイトへ入れるかも明示し、意図しないサイト内容を返さないようにします。

選択方法は三種類ある

Name-基づくホスト名で分ける

同じIP・ポートに複数サイトを置き、HTTP HostとTLS SNIから設定を選ぶ。現在の一般的な方式。

IP-基づく宛先IPで分ける

サイトごとに異なるIPアドレスを割り当て、接続が到着したアドレスから設定を選ぶ。

Port-基づく待受ポートで分ける

同じアドレスでも80、443、8080などポートを変える。URLに標準外ポートの明示が必要になる場合がある。

HTTPSではSNIが先、Hostが後

HTTPSではHTTP要求を読む前にTLSハンドシェイクを行います。クライアントはSNI(Server Name Indication/サーバー・ネーム・インディケーション)で接続したいホスト名を伝え、サーバーは証明書とTLS設定を選びます。

暗号化後にHTTPのHostヘッダーを読み、仮想ホストを選びます。SNIとHostが食い違う要求をどう扱うか、サーバーと逆プロキシの規則を決めます。証明書のSANにホスト名が含まれなければ警告になります。

各サイトの境界を設定へ反映する

仮想ホストごとにServerName、別名、文書ルート、索引、エラーページ、アクセスログ、エラーログ、TLS証明書、リダイレクト、セキュリティヘッダーを設定できます。

ログを一つへ混ぜる場合もホスト名を必ず記録します。障害調査で「どのサーバー」だけでなく「どの仮想ホスト」が応答したかを追えるようにします。

既定ホストは拒否用にできる

要求のホスト名がどの設定にも一致しない場合、多くのサーバーは最初または既定のサーバーブロックを使います。そこへ本番サイトを置くと、未知のHostでも内容を返し、意図しないドメインから閲覧されることがあります。

既定は短いエラー応答だけを返す設定にし、許可したホスト名を列挙します。HostヘッダーをパスワードリセットURLやキャッシュ鍵へ使うアプリケーションでも、信頼するホストを検証します。

DNS設定だけではサイトは増えない

新しいサブドメインのA・AAAAやCNAMEを同じサーバーへ向けても、Webサーバーに仮想ホスト設定、文書ルート、証明書がなければ既定サイトやエラーになります。反対に仮想ホストだけ作っても、DNSから到達できません。

DNS、サーバー待受、ファイアウォール、仮想ホスト、証明書、公開ファイルを一連として確認します。IPv4とIPv6で別サーバーへ到着する場合は、両方へ同じ設定が必要です。

ローカル試験は名前を保ったまま行う

ホストファイルで試験用ホスト名を検証サーバーのIPへ一時対応させれば、公開DNSを変えずにHostとSNIを含めて確認できます。単にIPアドレスをブラウザーへ入力すると、IPをHostとして既定サイトが選ばれます。

HTTPSでは試験ホスト名に合う証明書も必要です。証明書警告を無視した試験結果を本番の正常性としません。

仮想ホストは仮想システムではない

仮想ホストはWebサーバー内のサイト選択です。処理、OS、CPU、メモリーを完全に隔離するVPSやコンテナーとは異なります。一つのWebサーバー処理の障害や設定誤りが複数サイトへ影響し得ます。

「別ドメインだから別サーバー」とは限りません。DNSで同じアドレスへ届き、同じWebサーバーがホスト名ごとに別の公開設定を選ぶのがname-based仮想ホストです。

virtual host選択の確認資料:Apache HTTP Server「VirtualHost Examples」、nginx「How nginx processes a request」

関連用語