ApacheのVirtualHostってなんだ

Apache2.4のVirtualHostがわからないので勉強しつつメモ。
実際にコマンド打ったりしたわけじゃないので間違えてる部分もあるかも…

#ApacheのVirtualHostってなーに？
>バーチャルホストという用語は、1 台のマシン上で (company1.com と company2.com のような) 二つ以上のウェブサイトを扱う運用方法のことを指します。
[Apache バーチャルホスト説明書](https://httpd.apache.org/docs/2.4/ja/vhosts/)

example.comとかexample.netのドメインを複数運用してたとして、それぞれのドメインを別サーバーで設定するのは簡単。でも両方アクセスが少ないとサーバーを新規に構築するコストと見合わないですよね？
そこでVirtualHostの出番。1台のサーバーにインストールしたApacheを使って複数のドメインでサービスを行おうってことが出来る。

##ドキュメントルート云々
環境はCenetos7, Apache2.4

/var/www/にsample_host_htmlを作ったとしておく
作成したフォルダの所有者を apache ユーザーに変更をしておくこと。

//追記
DocumentRootがﾜｶﾗﾅｲ
クライアントからのアクセスを許可するディレクトリ、つまりブラウザから直接アクセス可能なファイルを設置する場所。

##VirtualHostの設定を作成
※ホスト名はsample.host.jpに設定してあるとする

```PHP:/etc/httpd/conf.d
touch sample.host.jp.conf
```
ファイル名はなんでもいいらしいがホスト名と合わせた方がいい。
拡張子に___.conf___をつける必要がある


最低限の設定

```apache:sample.host.jp.conf
<VirtualHost *:80>
  DocumentRoot /var/www/sample_host_html
  ServerName sample.host.jp
</VirtualHost>
```

Apache再起動、サイトが見えるか確認。終わり。

##まとめ
複数のドメインを使ってサイトを運用するならVirtualHostを使って、単体のドメインを使うなら~~(たぶんおそらくきっと)~~使わなくていいですね！
でも将来的に複数ドメインを使う可能性もあると思うので覚えておいて損はない。~~はず…！~~


#複数のドメインを１つのIPアドレスで扱いたい！

##ServerAliasなるものがあるんすよ。
サーバーはわかるけどエイリアスって何・・・？
>エイリアス 【alias】
エイリアスとは、本来は「変名」「別名」などの意味である。

なるほどわからん。実際に見てみる

```apache:sample.host.jp.conf
<VirtualHost *:80>
  DocumentRoot /var/www/sample_host_html
  ServerName sample.host.jp
</VirtualHost>
```
を書きましたよね？
でもこれじゃあwww.sample.host.jpでアクセスされたら404返すと思う(おそらく)

##ServerAliasがなかったら・・・？
```apache:sample.host.jp.conf
<VirtualHost *:80>
  DocumentRoot /var/www/sample_host_html
  ServerName sample.host.jp
</VirtualHost>

<VirtualHost *:80>
  DocumentRoot /var/www/sample_host_html
  ServerName www.sample.host.jp
</VirtualHost>
```

##もっとスマートに書きたい
Q. ServerNameにwww.sample.host.jpとsample.host.jp書けばいいじゃん
A. ダメです。そうするとApacheがエラー返してくるらしいです。

wwwありとwwwなし両方書くとどっかでミスりそう・・・
両方のバーチャルホストの設定なんて書きたくないよね？
そこで登場するのが___ServerAlias___。

```apache:sample.host.jp.conf
<VirtualHost *:80>
  DocumentRoot /var/www/sample_host_html
  ServerName sample.host.jp
  ServerAlias www.sample.host.jp
</VirtualHost>
```

これでwww.sample.host.jpでアクセスしてもsample.host.jpの名前としてのアクセスとして扱われる。ミスも減りそうだし便利ですね…。
注意点としてServerNameの下にServerAliasを書くこと。
例として

```apache:sample.conf
<VirtualHost *:80>
  DocumentRoot /var/www/sample_html
  ServerName sample.jp
  ServerAlias www.sample.jp www.sample.com
</VirtualHost>
```
みたいにホスト名 ホスト名みたいに半角スペースで区切ってもOK.

もちろん

```apache:sample.conf
<VirtualHost *:80>
  DocumentRoot /var/www/sample_html
  ServerName sample.jp
  ServerAlias www.sample.jp
  ServerAlias www.sample.com
</VirtualHost>
```
みたいな書き方でも大丈夫

便利～！

#VirtualHostのサポートって色々あるんですね
>ネームベースのバーチャルホスト (一つのIPアドレスに複数のウェブサイト)
IPベースのバーチャルホスト (各ウェブサイトにIPアドレス)
バーチャルホストの一般的な設定例
ファイル記述子の限界 (または、多過ぎるログファイル)
大量のバーチャルホストの設定
バーチャルホストのマッチングについての詳細
_[バーチャルホストのサポート](https://httpd.apache.org/docs/2.4/ja/vhosts/)_

とりあえず上２つを見ていこう。



##ネームベースのバーチャルホスト (一つの IP アドレスに複数のウェブサイト)
###名前ベースと IP ベースのバーチャルホストの比較
>IP ベースのバーチャルホストでは、応答する バーチャルホストへのコネクションを決定するために IP アドレスを使用します。ですから、それぞれのホストに個々に IP アドレスが必要になります。これに対して名前ベースのバーチャルホストでは、 クライアントが HTTP ヘッダの一部としてホスト名を告げる、 ということに依存します。この技術で同一 IP アドレスを異なる多数のホストで共有しています。
_[名前ベースと IP ベースのバーチャルホストの比較](https://httpd.apache.org/docs/2.4/ja/vhosts/)_



##IPベースのバーチャルホスト (各ウェブサイトにIPアドレス)
###システム要件
>IP ベース という名前が示すように、サーバには IP ベースのバーチャルホストそれぞれにつき、別々の IP アドレスが 必要です。複数の物理コネクションを持っているマシンを用意するか、 最近のオペレーティングシステムでサポートされているバーチャル インタフェース (詳細はシステムの説明書を読んでください。大抵は "ip エイリアス" と呼ばれていて、設定には普通 "ifconfig" コマンドを 使います) を使うかで実現できます。
_[システム要件](https://httpd.apache.org/docs/2.4/ja/vhosts/ip-based.html)_

####まとめ
IPベースだとホストに個々のIPが必要。
要するに__各ウェブサイトにIPアドレスが必要。__

ネームベースだとホスト名とそれに対応するIPアドレスをDNSで設定すれば複数のIPアドレスが要らない。
DNSを設定すれば__１つのIPアドレスで複数のウェブサイトを運用できる。__ はず？


#いろいろ気になったの書いていく
|  気になったの   |  ざっくりした説明                                     |
| -------------- | ---------------------------------------------------- |
|  CustomLog     | アクセスログ                                          |
|  ErrorLog      | エラーログ                                            |
|  AddHandler    | CGIスクリプトを使用するかしないか                       |
|  AllowOverride | .htaccessによる設定変更を有効にするかどうか             |
|  IfModule      | モジュールが存在する時に処理される                      |
|  RewriteEngine | RewriteEngineをONにするかOFFにするか                   |
|  RemoveHnadler | ファイル拡張子に関連付けされたハンドラをすべて解除する    |
|  RewriteCond   | 書き換えの条件を指定する。条件に一致したときだけ書き換え  |
|  RewriteRule   | 書き換えのルール。パターンに一致した値を置換する          |


##DirectoryとDocumentRootの違いがわからない!!
###ディレクティブ
>これは、それぞれの「設定項目（設定名）」のことを言っていると思ってもらってよいと思う。（厳密には違う…といわれるのだけども）たとえば、サーバルートを指定する部分は「ServerRootディレクティブ」というし、Apacheが接続を待ち受けるポート番号を指定する部分は「Listenディレクティブ」ということとなる。
_[たぶん難しくないApache2・初期設定編その１～お触りはダメよ！～](https://piro791.blog.so-net.ne.jp/2009-11-20-1)_


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

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

###Directory
>ルートディレクトリに対する指定を記述するディレクティブは、「Directory」ディレクティブを用いる。これは「/Directory」とセットで用い、この２つのディレクティブで囲まれた範囲内が、その指定されたディレクトリと、サブディレクトリに対して影響を及ぼすこととなる。
_[たぶん難しくないApache2・初期設定編その１～お触りはダメよ！～](https://piro791.blog.so-net.ne.jp/2009-11-20-1)_

なんとなくはわかるけど明確な違いって何だろう？
まだ理解するに至ってないです。

###また気になるものがふえた
|  気になったの   |  ざっくりした説明 |
| -------------- | ---------------- |
|  Allow from    | アクセス許可      |
|  Deny from     | アクセス不許可    |
|  Order         | 同一のディレクトリに対してDenyとAllowと両方を組み合わせてアクセス制御をする場合 |

####メモ
[[Apache] Options と AllowOverRide の設定値を改めて整理してみる](http://bashalog.c-brains.jp/10/11/16-121901.php)