1台のApache Web Serverに複数のドメインを設定する

#背景
テストサーバーで開発途中のコンテンツをお客さまに確認してもらうということがあります。
この時に、他の開発中のコンテンツが見えたりしても良くないので、確認用の独自ドメインを作ることが多いです。

いくつもプロジェクトが並行していると、一つのディレクトリ内にすべてのファイルをおくのもよくありません。
ということで、プロジェクトの確認用ごとに独自の URL があったほうが便利だし、そもそも html 内の参照 path を`<img src="/img/hoge.png" alt="">`とドキュメントルートからの相対で書いている場合が多いので、確認の時に他のプロジェクトと同居するとディレクトリ構造がずれて他のプロジェクトとまざったりするので、開発ディレクトリ配下ではなく別のドキュメントルートを設定します。

もちろん、本番公開時にもユーザー向けと管理画面用のURLをサブドメインを利用して変えたりということにも利用できます。
`http://service.com`
`https://admin.service.com`

そして、そんな時にこそ有効なのが Vistual Host なのです。

#Vistual Hostとは？
下記、参照。
[Apache バーチャルホスト説明書](https://httpd.apache.org/docs/2.2/ja/vhosts/)

要は、一台のサーバーに複数のドキュメントルートを作りましょうということです。

ドキュメントルートとは下記の引用を参照。
>「ドキュメントルート」（DocumentRoot）とは、実際に外部に公開するhtmlファイルとか画像ファイルとかのドキュメントデータを保存しているディレクトリの「てっぺん」を意味する。
　たとえば、ドキュメントルートが`/var/www/html`に指定されているとして、　`http://server/index.html`というファイルをアクセスしてきた場合、実際に提供されるファイルは原則的に`/var/www/html/index.html`ということになるし、　`http://server/directoryA/page.html`だったとしたら、実際に提供されるファイルは原則的に`/var/www/html/directoryA/page.html`ということになる。

[たぶん難しくないApache2・初期設定編その１～お触りはダメよ！～　[Linux(Apache)]](http://piro791.blog.so-net.ne.jp/2009-11-20-1)

#設定方法

Server は CentOS (AWS) の前提で書いてますが、他の OS でもそこまで変わらないでしょう。
また、Apache のバージョンによって微妙に設定が違います。

#####1. サーバーにログイン
サーバーにログインする。  
* ログインする時は root などの super user でログインする必要あり。
　(会社のメンバーで permission がなくてはまっていた人がいたので念のため。)
* AWS の場合はログインしてから`sudo su -`で root user になれます。   
　
#####2. ディレクトリ移動
`# cd /etc/httpd/conf.d`でディレクトリ移動  
　　　
#####3. vhost.confを編集  

`# vim vhost.conf`  
vhostディレクトリ配下の*.conf ファイルをすべて読み込むようにする。

```vim:vhost.conf
#NameVirtualHost *:80

Include vhost/*.conf

```
　　
#####4. 設定ファイルを作る準備 
親ディレクトリに移動して現状確認
`# cd ../`
`# ls -la`

vhostディレクトリがなければ新規にディレクトリを作成
`# mkdir vhost`

vhostに移動
`# cd vhost`  
　　
#####5. わかりやすい名前でconfファイルを作成。  
例えば会社では **test.whizzy.co.jp** というドメインを新たに作る場合などは、ファイル名を **test.whizzy.co.jp.conf** としているため`# vim test.whizzy.co.jp.conf`で作成します。  
　
#####6. 作成した conf ファイルを編集
* うちの会社ではsecurity 目的で `/var/www/html` をdocument rootにしておらず、別ディレクトリにしています。
* `SetEnv HTTP_X_FORWARD_PROTO`は、PHPでhttpからのアクセスなのかhttpsからのアクセスなのかを区別するために書いているだけなので、通常の設定ではなくても構いません。
* もちろん log も分けたほうが後で色々調査しやすいです。

**Apache2.2の場合**

```vim:test.whizzy.co.jp.conf
<virtualHost *:80>
    ServerName test.whizzy.co.jp
    DocumentRoot /usr/local/documentroot/testwhizzy
    AllowEncodedSlashes On
    CustomLog      logs/test.whizzy.co.jp.access.log combined
    ErrorLog       logs/test.whizzy.co.jp.error.log
    <Directory /usr/local/documentroot/testwhizzy>
	SetEnv HTTP_X_FORWARDED_PROTO http
	SetEnv REAL_HOST_NAME test.whizzy.co.jp
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
```

**Apache2.4の場合**
微妙に`<DIRECTORY>`の中身が違います。
これ知らないとはまります。

```vim:test.whizzy.co.jp.conf
<virtualHost *:80>
    ServerName test.whizzy.co.jp
    DocumentRoot /usr/local/documentroot/testwhizzy
    AllowEncodedSlashes On
    CustomLog      logs/test.whizzy.co.jp.access.log combined
    ErrorLog       logs/test.whizzy.co.jp.error.log
    <Directory /usr/local/documentroot/testwhizzy>
        SetEnv HTTP_X_FORWARDED_PROTO http
        SetEnv REAL_HOST_NAME test.whizzy.co.jp
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

ちなみに Apache のバージョン確認は`# httpd -v`にて

そうすると下記のようにバージョンが確認できます。

```
Server version: Apache/2.4.16 (Amazon)
Server built:   Dec 18 2015 23:01:05
```

#####7. Apache再起動

`# service httpd restart`
当たり前ですが、再起動を忘れると設定は反映されないので。。。


#####9. DNS設定

DNS に新しいドメイン（サブドメイン）を登録し、設定したサーバーのIPアドレスを設定します。

* DNS が反映されるまではアクセスしてもサーバーが見つからないので、その場合は hosts ファイルに記載する
* DNSが反映されたら hosts ファイルを元に戻すのを忘れない
 

#参考サイト
[Apache2.4.3でバーチャルホストの設定にハマる](http://ameblo.jp/rb26/entry-11440052587.html)