Apache HTTP Serverの名前ベース仮想ホスト
Apache HTTP Server (httpd) の仮想ホスト,バーチャルホスト (Virtual Host) という機能がよくわからなかったので整理する。
概要
httpdは基本的に1個のサーバーで1個のWebサイトに対応している。ただ,1サイト1サーバーだとサイトが小さいともったいない。こういうときに,仮想ホストを使うことで,1個のhttpdで複数のサイトに対応することができる。
仮想ホストには,名前ベースとIPアドレスベースの2種類の仮想ホストがある。IPベースの仮想ホストを実現するには,マシンが複数のIPアドレスを持つ必要があり,手間がかかるのもありあまり使われていない印象がある。
そこで,手軽な名前ベースの仮想ホストについて「Name-based Virtual Host Support – Apache HTTP Server Version 2.4」を元に整理する。IPベースの仮想ホストは「Apache IP-based Virtual Host Support – Apache HTTP Server Version 2.4」を参照する。
Amazon Linux 2のhttpd 2.4.39で確認した。
設定
名前ベースの仮想ホストはクライアントのHTTPヘッダーのホスト名で判断して,応答ホストを切り替える。
名前ベースの仮想ホストを使う場合,以下のように<VirtualHost>
指令の引数に*:80
のように,ワイルドカードのIPアドレスとポート番号を指定して,そのセクション内にServerName
とDocumentRoot
を指定して応答が別々のサーバーであることを指定する。
<VirtualHost _default_:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot "/var/www/html"
</VirtualHost>
<VirtualHost *:80>
Define OTHER_DOMAIN other.example.com
Define OTHER_DOCUMENT_ROOT /usr/local/var/www/${OTHER_DOMAIN}
ServerAdmin webmaster@${OTHER_DOMAIN}
ServerName ${OTHER_DOMAIN}
DocumentRoot ${OTHER_DOCUMENT_ROOT}
ErrorLog "logs/${OTHER_DOMAIN}-error_log"
CustomLog "logs/${OTHER_DOMAIN}-access_log" common
<Directory ${OTHER_DOCUMENT_ROOT}>
Options Indexes FollowSymLinks
AllowOverride AllowOverride AuthConfig FileInfo Indexes Limit
Require all granted
</Directory>
</VirtualHost>
IPアドレスにワイルドカード (*
) を指定して,ServerName
に別のホスト名を指定しているところが,名前ベースの仮想ホストの特徴だ。IPベースの仮想ホストの場合,これが逆となりIPアドレスが明示的に別のものとなり,ServerName
が同じとなる。
<VirtualHost>
指令の第1引数のIPアドレスの_default_
はワイルドカード (*
) と同じ意味だ。
万が一,ServerName
を指定しなかった場合,マシンのホスト名 (/etc/hostname
など) が暗黙的に設定される。ただ,暗黙のServerName
は推奨されていない。
なお,名前ベースの仮想ホストを設定しない場合,別のドメインからアクセスされても,同じDocumentRoot
を参照するため,同じ内容を応答する。
仮想ホストでホストを追加する場合,httpdのサーバーをもう一個用意したつもりで同じ設定を指定する。
具体的には,上記の例のようにServerName, DocumentRoot
の他に,ServerAdmin, ErrorLog, CustomLog
に加え<Directory>
指令でアクセス権などを設定してやる必要があるだろう。
その他に,HTTPSの設定も仮想ホストで設定する必要がある。
httpdをソースコードからインストールした場合,仮想ホストの設定はconf/extra/httpd-vhost.conf
にあり,httpd.conf
からInclude
する形で用意されている。HTTPSの仮想ホストはconf/extra/httpd-ssl.conf
にある。
ただ,httpd-vhost.conf
とhttpd-ssl.conf
に別々に設定すると,設定がバラバラになって管理しにくくなる。仮想ホストごとに,httpd-<domain>.conf
ファイルを用意してこれをInclude
する形にしたほうがたぶんいい。
このホストごとの共通設定は内容が多くなるので,「Apache HTTP Serverの仮想ホストの共通設定」に分離して掲載した。
仮想ホストの追加
元々仮想ホストなしで運営していたhttpdに対して仮想ホストを追加する場合,方法が2種類ある。
1. は単に追加のホストを<VirtualHost>
指令で追加するだけだ。実動作を確認したところ,既存のサーバーの仮想ホストが存在しない場合,既存のサーバーはグローバルな設定が適用され,別ドメインの仮想ホストも並行して有効となっていた。
2. は全て仮想ホストで対応する。引数が既存のIPとポート番号に一致する同じServerNameの名前ベースの仮想ホストが存在する場合,既存のサーバーの設定ではなく,仮想ホストの設定で処理される。この性質を利用して,既存のホストも仮想ホストで設定を上書きできる。
どちらかというと2の方法が推奨されているようだ。ただ,仮想ホストでどんどん追加することを考えると,デフォルトのホストの設定は放っておく1の方法でもいいだろう。
結論
httpdの名前ベース仮想ホストについて整理した。
整理する前はなんだか複雑な感じがしていた。今回,整理したことで単に<VirtualHost>
指令でセクションを作って,その中にそれぞれのホストごとの設定を記入するだけということがわかった。
仮想ホストを使うと,メインホストがなくなるとか全て仮想ホストにしないといけないとか噂を聞いていたのだが,実際に動作を確認したところ,特にそんなこともなかった。
名前ベース仮想ホストで1httpdで複数のサイトを運営できるようにしたい。
“Apache HTTP Serverの名前ベース仮想ホスト” に対して1件のコメントがあります。