Edited at

ApacheのVirtualHostってなんだ

More than 1 year has passed since last update.

Apache2.4のVirtualHostがわからないので勉強しつつメモ。

実際にコマンド打ったりしたわけじゃないので間違えてる部分もあるかも…


ApacheのVirtualHostってなーに?


バーチャルホストという用語は、1 台のマシン上で (company1.com と company2.com のような) 二つ以上のウェブサイトを扱う運用方法のことを指します。

Apache バーチャルホスト説明書


example.comとかexample.netのドメインを複数運用してたとして、それぞれのドメインを別サーバーで設定するのは簡単。でも両方アクセスが少ないとサーバーを新規に構築するコストと見合わないですよね?

そこでVirtualHostの出番。1台のサーバーにインストールしたApacheを使って複数のドメインでサービスを行おうってことが出来る。


ドキュメントルート云々

環境はCenetos7, Apache2.4

/var/www/にsample_host_htmlを作ったとしておく

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

//追記

DocumentRootがワカラナイ

クライアントからのアクセスを許可するディレクトリ、つまりブラウザから直接アクセス可能なファイルを設置する場所。


VirtualHostの設定を作成

※ホスト名はsample.host.jpに設定してあるとする


/etc/httpd/conf.d

touch sample.host.jp.conf


ファイル名はなんでもいいらしいがホスト名と合わせた方がいい。

拡張子に.confをつける必要がある

最低限の設定


sample.host.jp.conf

<VirtualHost *:80>

DocumentRoot /var/www/sample_host_html
ServerName sample.host.jp
</VirtualHost>

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


まとめ

複数のドメインを使ってサイトを運用するならVirtualHostを使って、単体のドメインを使うなら(たぶんおそらくきっと)使わなくていいですね!

でも将来的に複数ドメインを使う可能性もあると思うので覚えておいて損はない。はず…!


複数のドメインを1つのIPアドレスで扱いたい!


ServerAliasなるものがあるんすよ。

サーバーはわかるけどエイリアスって何・・・?


エイリアス 【alias】

エイリアスとは、本来は「変名」「別名」などの意味である。


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


sample.host.jp.conf

<VirtualHost *:80>

DocumentRoot /var/www/sample_host_html
ServerName sample.host.jp
</VirtualHost>

を書きましたよね?

でもこれじゃあwww.sample.host.jpでアクセスされたら404返すと思う(おそらく)


ServerAliasがなかったら・・・?


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


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を書くこと。

例として


sample.conf

<VirtualHost *:80>

DocumentRoot /var/www/sample_html
ServerName sample.jp
ServerAlias www.sample.jp www.sample.com
</VirtualHost>

みたいにホスト名 ホスト名みたいに半角スペースで区切ってもOK.

もちろん


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アドレス)

バーチャルホストの一般的な設定例

ファイル記述子の限界 (または、多過ぎるログファイル)

大量のバーチャルホストの設定

バーチャルホストのマッチングについての詳細

バーチャルホストのサポート


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


ネームベースのバーチャルホスト (一つの IP アドレスに複数のウェブサイト)


名前ベースと IP ベースのバーチャルホストの比較


IP ベースのバーチャルホストでは、応答する バーチャルホストへのコネクションを決定するために IP アドレスを使用します。ですから、それぞれのホストに個々に IP アドレスが必要になります。これに対して名前ベースのバーチャルホストでは、 クライアントが HTTP ヘッダの一部としてホスト名を告げる、 ということに依存します。この技術で同一 IP アドレスを異なる多数のホストで共有しています。

名前ベースと IP ベースのバーチャルホストの比較



IPベースのバーチャルホスト (各ウェブサイトにIPアドレス)


システム要件


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

システム要件



まとめ

IPベースだとホストに個々のIPが必要。

要するに各ウェブサイトにIPアドレスが必要。

ネームベースだとホスト名とそれに対応するIPアドレスをDNSで設定すれば複数のIPアドレスが要らない。

DNSを設定すれば1つのIPアドレスで複数のウェブサイトを運用できる。 はず?


いろいろ気になったの書いていく

気になったの
ざっくりした説明

CustomLog
アクセスログ

ErrorLog
エラーログ

AddHandler
CGIスクリプトを使用するかしないか

AllowOverride
.htaccessによる設定変更を有効にするかどうか

IfModule
モジュールが存在する時に処理される

RewriteEngine
RewriteEngineをONにするかOFFにするか

RemoveHnadler
ファイル拡張子に関連付けされたハンドラをすべて解除する

RewriteCond
書き換えの条件を指定する。条件に一致したときだけ書き換え

RewriteRule
書き換えのルール。パターンに一致した値を置換する


DirectoryとDocumentRootの違いがわからない!!


ディレクティブ


これは、それぞれの「設定項目(設定名)」のことを言っていると思ってもらってよいと思う。(厳密には違う…といわれるのだけども)たとえば、サーバルートを指定する部分は「ServerRootディレクティブ」というし、Apacheが接続を待ち受けるポート番号を指定する部分は「Listenディレクティブ」ということとなる。

たぶん難しくないApache2・初期設定編その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・初期設定編その1~お触りはダメよ!~



Directory


ルートディレクトリに対する指定を記述するディレクティブは、「Directory」ディレクティブを用いる。これは「/Directory」とセットで用い、この2つのディレクティブで囲まれた範囲内が、その指定されたディレクトリと、サブディレクトリに対して影響を及ぼすこととなる。

たぶん難しくないApache2・初期設定編その1~お触りはダメよ!~


なんとなくはわかるけど明確な違いって何だろう?

まだ理解するに至ってないです。


また気になるものがふえた

気になったの
ざっくりした説明

Allow from
アクセス許可

Deny from
アクセス不許可

Order
同一のディレクトリに対してDenyとAllowと両方を組み合わせてアクセス制御をする場合


Directoryが複数あったらどうなるの?

わからない…


メモ

[Apache] Options と AllowOverRide の設定値を改めて整理してみる


最後に

落ち着いたらしっかりまとめたり分割して投稿します。