Apache でマルチドメインを設定する
About
複数のドメインを1つのサーバ内にある複数のディレクトリに割り当てたり、単純に1つのサーバ(の1つのディレクトリ)に複数のドメインを設定することをマルチドメインと言います。ここではメジャーなサーバである Apache でマルチドメインを実現する方法についてまとめておきます。
HowTo
Apache にマルチドメインの設定を行うときは、[/etc/httpd/conf/httpd.conf] ファイルを編集します。設定ファイルはテキスト形式で記述されていますので、実際には vi などから開くことになります。編集に入り次の項目を探します。バージョンによって差異はあるでしょうが、多くの場合は末尾の方に記述される項目です。
1. NameVirtualHost の有効化
# # Use name-based virtual hosting. # #NameVirtualHost *:80 # # NOTE: NameVirtualHost cannot be used without a port specifier # (e.g. :80) if mod_ssl is being used, due to the nature of the # SSL protocol. #
"NameVirtualHost *:80" と記述されている箇所の、先頭にある "#" の文字を消します。 # は、コメント化の記号で、# から始まる記述はすべて Apache のシステムからは認識されなくなります。ここで # を消すことによって有効にします。
2. VirtualHost の設定
マルチドメイン化する準備が整ったら、複数のドメインが、どのディレクトリに割り当てられるかなどを設定してきます。ここでまず説明しておかなければならないことがあります。それは後に続いて解説する設定記述は、記述する箇所がいくつか考えられることです。まずは一般的な記述場所を例に解説しますが、後に続いていくつか別の例についても解説します。
一般的には先のファイル [/etc/httpd/conf/httpd.conf] の編集した箇所の下に次の設定項目を追記していきます。
# # Use name-based virtual hosting. # NameVirtualHost *:80 # # NOTE: NameVirtualHost cannot be used without a port specifier # (e.g. :80) if mod_ssl is being used, due to the nature of the # SSL protocol. # ここに追記
ここでは、"sample1.net" と "sample2.org" というドメインの2つを設定することとします。それぞれを [/var/www/sample1.net/] と [/var/www/sample2.org/] なるディレクトリへアクセスるように設定するとき、次のように記述します。
<VirtualHost *:80> ServerName www.sample1.net DocumentRoot /var/www/sample1.net ServerAdmin sample@sample1.net ErrorLog /var/www/sample1.net/logs/error_log CustomLog /var/www/sample1.net/logs/access_log combined </VirtualHost> <VirtualHost *:80> ServerName www.sample2.org DocumentRoot /var/www/sample2.org ServerAdmin sample@sample2.org ErrorLog /var/www/sample2.org/logs/error_log CustomLog /var/www/sample2.org/logs/access_log combined </VirtualHost>
パラメータは次の通りです。特に重要なのは、[ServerName] と [DocumentRoot] の2つのパラメータになります。
Parameter | Description |
ServerName | サーバの名前を指定します。(必須) |
DocumentRoot | 設定した名前でアクセスされるディレクトリを指定します。(必須) |
ServerAdmin | サーバの管理者の連絡先を指定します。(任意) |
ErrorLog | 対象のサーバ名でのエラーの出力先を指定します。(任意) |
CustomLog | 対象のサーバ名での変更記録の出力先を指定します。(任意) |
編集を完了して保存したら httpd を再起動する必要があります。次のコマンドから再起動を実行します
# /etc/init.d/httpd restart
3. ServerAlias による異なるドメインの共有
2つ(複数)のドメインを1つのディレクトリにアクセスさせたい場合があります。例えば元々あるドメインとディレクトリの設定から、新たに取得したドメインへ移行させたいときに、ユーザやリンクのために古いリンクをしばらく残しつつ、新しいドメインを積極的に利用する場合などです。
まずもっとも簡単な方法は、VirtualHost の設定項目をドメインの数だけ用意することです。次に sample2.org なるドメインへのアクセスを、sample1.net と同じディレクトリへのアクセスとなるように設定します。しかしながらこの方法は同じ設定項目をいくつも用意しなければならず、冗長で、もしも1つのパラメータを変更したい場合があったとき、すべてのパラメータを更新しなければならず、保守管理性に欠けます。
<VirtualHost *:80> ServerName www.sample1.net DocumentRoot /var/www/sample1.net ServerAdmin sample@sample1.net ErrorLog /var/www/sample1.net/logs/error_log CustomLog /var/www/sample1.net/logs/access_log combined </VirtualHost> <VirtualHost *:80> ServerName www.sample2.org DocumentRoot /var/www/sample1.net ServerAdmin sample1@sample1.net ErrorLog /var/www/sample1.net/logs/error_log CustomLog /var/www/sample1.net/logs/access_log combined </VirtualHost>
こういった時には、パラメータ [ServerAlias] を利用します。ServerAlias はある名前(URL)からアクセスは、その他のパラメータから定義される VirtualHost の設定に従う、といった処理を実現するパラメータです。先の例を ServerAlias を使って改善すると次のようになります。
<VirtualHost *:80> ServerName www.sample1.net ServerAlias www.sample2.org DocumentRoot /var/www/sample1.net ServerAdmin sample@sample1.net ErrorLog /var/www/sample1.net/logs/error_log CustomLog /var/www/sample1.net/logs/access_log combined </VirtualHost>
実際に新しいドメインへ移行するときには、リダイレクトも合わせて利用することになるでしょう。
VirtualHost を設定する httpd.conf ファイルについて
ここでは [/etc/httpd/conf/httpd.conf] ファイルに VirtualHost の設定項目を追記するようにしましたが、サーバの設定(やOS)によっては異なるファイルを編集することが必要となる場合があります。ここではいくつか紹介しますがこれの限りではない点に注意してください。またここでは紹介していないパラメータなどが既に記述されている可能性がありますが、ファイルをよく見て適切に書き換えるようにしてください。必要(不安)なら編集前のファイルのバックアップを取ることをおススメします。
conf.d/xxx_virtualhost.conf
[httpd.conf] ではなく、[/etc/httpd/conf.d/xxx_virtualhost.conf] ファイルを編集する必要がある可能性があります。これは一部のサーバ利用される OS で良く見られます。conf.d ディレクトリ以下に、Apache の設定ファイルを配置し、管理する手法です。このディレクトリの中に、[XXX~virtualhost.conf] なるファイルが存在するとき、VirtualHost に関する設定はこのファイルが担当しているため、このファイルの内容を書き換える必要があります。
インクルードされた .conf ファイル
httpd.conf や conf.d などに、"Include xxx~.conf" という記述があるとき、"Include" 以降に記述されたファイルを読み込んで、設定を行うようになっています。したがって、VirtualHost に関する設定は読み込まれるファイルに記述されている可能性があるので、もしも上手く設定がいかなければ読み込まれるファイルの中身を確認してみましょう。次のものは例です。
Include /var/www/vhosts/sample2.org/conf/*_vh_base.conf