1つのサーバで複数ドメインを使う、いわゆるマルチドメインで、各ドメインごとに別々のサイトを運用したい場合ってありますよね?
例えば、aaa.comでサイトAを運用しているサーバーに、新たにbbb.comのドメインでサイトBを構築する場合、イメージとしてはこんな感じで。
この時のサーバ上のapacheの設定について紹介します。
note
マルチドメインを実現するためには、ドメインの取得とDNS設定が必要ですが、この辺りの設定はご利用の業者によって様々なので、ご利用の業者の設定方法に従って設定をして頂く必要があります。
将来マルチドメインでの運用を考えていて、現在は設定のみを確認したいという方は、お使いの端末のhostsファイルを書きかえることで確認可能ですのでお試しください。
apacheの設定
今回確認に使用した環境は
OS: CentOS Version 6.7
Apache: Version 2.2.15
になります、お使いの環境によってはhttpd.confのパスなどが違っているかもしれませんので、適宜読み替えてご確認お願いします。
※ 設定を行う際は設定前のファイルのバックアップを忘れずに。
やりたいこと
以下の構成で既存サイトAを運用しているサーバに、新規ドメインbbb.comで新規サイトBが表示されるように設定します。
ドメイン: aaa.com
サイトのディレクトリ:/var/www/html
ドメイン: bbb.com
サイトのディレクトリ:/var/www/new-site
設定内容
設定はapacheの設定ファイル
/etc/httpd/conf/httpd.conf
に記載することで行います。
もっともシンプルな設定
サーバ上のapacheの設定ファイル httpd.conf の末尾に
以下の内容を追加します。
1 2 3 4 5 6 7 8 9 10 11 |
NameVirtualHost *:80 <VirtualHost *:80> ServerName aaa.com DocumentRoot /var/www/html </VirtualHost> <VirtualHost *:80> ServerName bbb.com DocumentRoot /var/www/new-site </VirtualHost> |
この設定だけで、既存のサイトの設定はそのままに、bbb.comドメインへのリクエストのみを/var/www/new-siteに振り分ける設定になります。
実用的な設定
実用的にはDirectoryの設定をしておいた方がいいでしょう。また、アクセスログもドメイン別で分ける設定をすると以下の様になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
NameVirtualHost *:80 <VirtualHost *:80> ServerName aaa.com DocumentRoot /var/www/html ErrorLog logs/aaa-error_log CustomLog logs/aaa-access_log common <Directory "/var/www/html"> AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> <VirtualHost *:80> ServerName bbb.com DocumentRoot /var/www/new-site ErrorLog logs/bbb-error_log CustomLog logs/bbb-access_log common <Directory "/var/www/new-site"> AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> |
※ Directoryの設定やアクセスログ名などの設定は使用目的に合わせて変更してください。
各設定項目について
各設定項目の概要については以下になります。
VirtualHostの設定によってリクエストを処理するIPドレス:ポート番号を指定するための項目
指定したIPドレス:ポート番号の設定を囲む為の項目
VirtualHostで設定を適応するホスト名を指定する項目
VirtualHost内の設定で受けたリクエストのルートのパスを指定する項目
VirtualHostで受けたリクエストの各ログの設定
記載がなければ、httpd.conf内のデフォルトの設定が適応される
指定したディレクトリに対する設定を囲む為の項目
ファイルの分割管理
更に管理上、VirtualHostの設定を別ファイルに分けることがあり、以下のような構成が良く使われています。
この場合httpd.confの記述と各vhostの中身は以下の様なります。
httpd-vhosts-aaa.conf
1 2 3 4 5 6 7 8 9 10 11 |
<VirtualHost *:80> ServerName aaa.com DocumentRoot /var/www/html ErrorLog logs/aaa-error_log CustomLog logs/aaa-access_log common <Directory "/var/www/html"> AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> |
httpd-vhosts-bbb.conf
1 2 3 4 5 6 7 8 9 10 11 |
<VirtualHost *:80> ServerName bbb.com DocumentRoot /var/www/new-site ErrorLog logs/bbb-error_log CustomLog logs/bbb-access_log common <Directory "/var/www/new-site"> AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> |
httpd.conf
1 2 3 |
NameVirtualHost *:80 Include conf/extra/httpd-vhosts-aaa.conf Include conf/extra/httpd-vhosts-bbb.conf |
httpd.confのIncludeで指定したファイルは、ファイルの中身がそのままhttpd.conf内に記述されているのと同じ意味になります。なので、設定上はhttpd.confに直接設定を書き込んだ時と同じになります。
設定の反映方法
httpd.confの設定が終われば以下のように設定を反映します。
まずは以下のコマンドで設定にエラーがないかをチェック
1 |
apachectl -t |
エラーがなければapacheをリスタートして設定反映
1 |
apachectl restart |
実際に、元のサイトと、追加したサイトにアクセスして動作を確認して、それぞれ設定したディレクトリ上のサイトが確認できれば成功です。
備考
IP直打ちの場合はどのサイトが参照されるの?
VirtualHostでホスト名ごとの設定が出来ることはわかりましたが、IP直打ちの場合はどうなるんでしょう?
結論的にはServerNameで指定されていないドメインでのリクエストについては、最初のVirtualHostで指定した設定がデフォルトの設定として適応されます。
詳細はバーチャルホストの例 – Apache HTTP サーバ バージョン 2.4に説明がありますので、ご参照お願いします。
また、コマンドによる確認方法は、vhostのデフォルト設定の確認方法にまとめましたので、ご確認お願いします。
まとめ
vhostsの設定だけみると、意外と簡単?ですよね。ただvhostsが増えていくとどんどんややこしくなっていくんですよね。大変ですが先を見越して構成を考えることが大事なんでしょうね。