読者です 読者をやめる 読者になる 読者になる

プログラマでありたい

おっさんになっても、プログラマでありつづけたい

今さらながらapacheで名前ベースのVirtualHostの設定をする

Web/APサーバ

 Apacheで1サーバで複数のサイトを運用する場合、方法は二つあります。IPベースのVirtualHostを使うか、名前ベースのVirtualHostを使うかです。(違うポートでApacheを複数台立ち上げるとかもあるけど、本質的にはIPベースのVirtualHostと同じなので省きます。)
 実は私は名前ベースのVirtualHostの存在を知っていても使ったことがなかったので、今回初めて使ったのでメモしておきます。


 まずIPベースと名前ベースの違いについてです。apacheの日本語ドキュメントを見れば解りやすく解説しています。IPベースの場合だと複数のIPアドレスが必要になるけど、名前ベースだと一つのIPで運用できますよとのことです。その代わり制約があって、クライアントが古いと対応出来なかったり、SSLは使えませんよといったことがあるようです。個人で遊びで使うには無問題かと思います。

 名前ベースのバーチャルホスト - Apache HTTP サーバ

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

名前ベースのバーチャルホストは通常単純で、それぞれのホスト名と それに対応する正確な IP アドレスを DNS で設定し、異なる ホスト名を区別するように Apache HTTP サーバを設定するだけです。 さらに、名前ベースのバーチャルホストは不足する IP アドレスの需要を緩和します。したがって、IP ベースのバーチャルホストを 選択すべき特定の理由がなければ名前ベースのバーチャルホストを使うべきです。 IP ベースのバーチャルホストを使用することを考慮する理由として、

* 名前ベースのバーチャルホストに対応していない古いクライアントがある 名前ベースのバーチャルホストが働くためには、クライアントは HTTP ホストヘッダを送ってこなければなりません。 これは HTTP/1.1 の仕様で要求されていて、すべての現代的な HTTP/1.0 ブラウザでも拡張として実装されています。 とても古いクライアントをサポートしつつ、名前ベースの バーチャルホストを行いたい場合は、この文書の最後の方に 書かれている解決策になるかもしれない方法を見てください。
* 名前ベースのバーチャルホストは SSL プロトコルの特徴により、 SSL セキュアサーバには使えません。
* オペレーティングシステムやネットワーク装置のなかには、 別の IP アドレス上でない場合、複数のホストを別扱いできないような 帯域管理の方法を実装しているものがあります。


 さて設定ですが、これも簡単。
NameVirtualHostの受付ポートを宣言して、名前ごとに設定すれば良いだけです。

NameVirtualHost *:80

<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>

<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>

 サイトごとにコンフィグファイルを分ければ、保守性はあがるでしょう。
ただログフォーマットをカスタムで設定している場合は、都度定義しないといけないので
それはそれで面倒くさいかもしれません。

# apachectl configtest
Syntax OK
# /etc/init.d/httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

最後にapachectrlでコンフィグのテストをして、O.K.がでたらApacheの再起動を行いましょう。簡単ですよね。