SSブログ

たぶん難しくないApache2・バーチャルホスト編~一粒で二度美味しい?~ [Linux(Apache)]

 DDNSサービスが、DiCE等の優れたソフトウェアのおかげでとても利用しやすくなったことを受けて、自分用のWebサーバを立てている人も徐々に増えているのではないかと思うけども、中には、「用途別に違うドメイン名でサーバを立てたい!」なんて贅沢な(?)悩みを持つ人も出てきているのではないだろうか。
 サーバが複数台あれば、それぞれ立ててしまうという手もあるけども、ご家庭用のブロードバンドルータ等ではネットワーク的に凝ったことが出来なくて…みたいなことで悩まされることもあるかもしれない。

 そこで、Apache2に用意されている「バーチャルホスト」という機能を使うことができるということを紹介しておこう。

 これは、1台のWebサーバに、複数の名前(サーバ名)を割り当てる事ができ、かつそのその名前(サーバ名)ごとに異なる挙動をとらせることが出来るという、大変に便利な機能なのである。

 たとえば、NICが複数あるサーバがあるとして、NICの1番と2番とで異なるコンテンツを見せることが出来るとか、同一のIPアドレスでも異なるFQDN名を付けておけばそのFQDN名ごとに異なるコンテンツを見せることも出来る。
 イメージが沸きにくいかもしれないが、たとえば/etc/hosts(Windowsの場合は C:\WINDOWS\system32\drivers\etc\hosts とかそのへん)に…

192.168.0.10 class-3b.ryoou-gakuen.ac.jp
192.168.0.10 class-1d.ryoou-gakuen.ac.jp
192.168.0.10 teachers-room.ryoou-gakuen.ac.jp

 と記述していたと仮定する。この場合、本来ならどのサーバ名を用いても物理的には同じサーバにアクセスが行くことになる。

 http://class-3b.ryoou-gakuen.ac.jp/
 http://class-1b.ryoou-gakuen.ac.jp/
 http://teachers-room.ryoou-gakuen.ac.jp/

 それぞれ同じドキュメントルートの中にあるindex.htmlあたりが見えちゃったりするはずである…ということね。

 ところが、Apache2の持つ「バーチャルホスト」の設定を適切に行うことで、それぞれ別々のコンテンツを見せることができるのである…という仕組み。

 では、まずその基本編に挑戦してみる。手順としてはそれほど難しくは無い。

 さきほど例示したFQDN名(ホスト名)で、それぞれ異なるindex.htmlが表示できるようにしてみる。
手順としては、
手順1:ホスト名を決定する。必要に応じてDNSに登録したりhostsファイルに記述したりする
手順2:それぞれのホストで表示させるコンテンツを用意する
手順3:ドキュメントルートディレクトリをホスト毎に用意してコンテンツを配置する
手順4:httpd.confにバーチャルホストの設定を記述する
手順5:httpdを起動してテストしてみる

手順1:ホスト名を決定する。必要に応じてDNSに登録したりhostsファイルに記述したりする
 まずはこの作業から。
 DDNSに登録するとか、会社のイントラネットなら社内のDNSサーバに登録するとか、ご家庭内のテストならクライアントPCのhostsファイルにIPアドレスとホスト名を記述するなどする。
 ちなみにここでは、先ほど例示したホスト名とIPアドレスを使用することにする。

192.168.0.10 class-3b.ryoou-gakuen.ac.jp
192.168.0.10 class-1d.ryoou-gakuen.ac.jp
192.168.0.10 teachers-room.ryoou-gakuen.ac.jp

 こんな設定。(IPアドレスは適切に変更する必要があることは言うまでも無い)

手順2:それぞれのホストで表示させるコンテンツを用意する
 コンテンツを用意する。面倒くさいので、index.htmlにぺろっとテキストを書くだけということで。(笑)
 まず、class-3bのindex.htmlから。
[root@kagami class-3b]# cat index.html
<html>
<body>
Konata.Izumi<br>
Tsukasa.Hiiragi<br>
Kagami.Hiiragi<br>
Miyuki.Takara<br>
Minoru.Shiraishi<br>
</body>
</html>

 次に、class-1dのindex.htmlは…
[root@kagami class-1d]# cat index.html
<html>
<body>
Yutaka.Kobayakawa<br>
Minami.Iwasaki<br>
Hiyori.Tamura<br>
Patricia Martin<br>
</body>
</html>

 そして、teachers-roomのindex.htmlは…
[root@kagami teachers-room]# cat index.html
<html>
<body>
Nanako.Kuroi<br>
Hikaru.Sakuraba<br>
Fuyuki.Amahara<br>
</body>
</html>

 と、してみた。

手順3:ドキュメントルートディレクトリをホスト毎に用意してコンテンツを配置する
 で、そのそれぞれのindex.htmlをバーチャルホスト毎にドキュメントルートディレクトリを用意して、それぞれのドキュメントルートに配置することにする。
 ドキュメントルートは、
class-3b … /var/www/html/class-3b
class-1d … /var/www/html/class-1d
teachers-room … /var/www/html/teachers-room
 ということにする。

手順4:httpd.confにバーチャルホストの設定を記述する
 いよいよhttpd.confに設定を記述する。ここで活躍するのは「VirtualHost」ディレクティブである。なお、VirtualHostディレクティブの使用に先立って必要になるディレクティブがある。それは「NameVirtualHost」である。
 ちなみに、今回基本編として紹介しているバーチャルホストは、「名前ベースのバーチャルホスト」に該当する。同一のIPアドレスに複数の名前を割り当てているので、ここで使うNameVirtualHostディレクティブは、1パターンの記述方法のみ用いる。
 VirtualHostディレクティブは、これまでに登場したDirectoryディレクティブやFileディレクティブと同様に、「<VirtualHost (名前)>」と「</VirtualHost>」という2つのディレクティブで囲んだ範囲が有効になる仕組み。

 では、実際のバーチャルホストの定義(1個目)を見てみよう。

NameVirtualHost *:80
<VirtualHost *:80>
ServerName class-3b.ryoou-gakuen.ac.jp
DocumentRoot /var/www/html/class-3b
<Directory /var/www/html/class-3b>
Order Deny,Allow
Allow from All
</Directory>
</VirtualHost>

 DirectoryディレクティブやFileディレクティブの時は、そのディレクティブに続けて記述したディレクトリ名やファイル名が、その囲まれた範囲内で適用される設定の適用先を表していたが、「名前ベースのバーチャルホスト」では、「*:80」と記述している。これは、この後で紹介する2個目・3個目も同じ記述をするので、この記述を持って適用先が決定されるわけではない。
 「名前ベースのバーチャルホスト」では、VirtualHostディレクティブの中にある、「ServerName」ディレクティブによって、どのVirtualHostディレクティブの塊が適用されるかが決まるのである。よって、上記の例では、「http://class-3b.ryoou-gakuen.ac.jp/」でアクセスされたときに、この塊の設定が適用される…ということになる。
 で、このバーチャルホストのドキュメントルートは/var/www/html/class-3bですよ…と宣言している。そして、そのドキュメントルートに対するアクセス許可の設定も、バーチャルホストの設定の中で行っている。

 class-1dやteachers-roomについても同じように設定する。ただし、NameVirtualHostは全体で1個だけあればよい。

NameVirtualHost *:80

<VirtualHost *:80>
ServerName class-3b.ryoou-gakuen.ac.jp
DocumentRoot /var/www/html/class-3b
<Directory /var/www/html/class-3b>
Order Deny,Allow
Allow from All
</Directory>
</VirtualHost>

<VirtualHost *:80>
ServerName class-1d.ryoou-gakuen.ac.jp
DocumentRoot /var/www/html/class-1d
<Directory /var/www/html/class-1d>
Order Deny,Allow
Allow from All
</Directory>
</VirtualHost>

<VirtualHost *:80>
ServerName teachers-room.ryoou-gakuen.ac.jp
DocumentRoot /var/www/html/teachers-room
<Directory /var/www/html/teachers-room>
Order Deny,Allow
Allow from All
</Directory>
</VirtualHost>

 これでよし。

 そんな訳で、今回使用したhttpd.confはこんな感じ。
[root@kagami conf]# cat httpd.conf
ServerRoot      "/etc/httpd"
PidFile         run/httpd.pid
Listen          80
User            apache
Group           apache

ServerName      kagami.hiiragi.com:80

LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule dir_module modules/mod_dir.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule mime_module modules/mod_mime.so

<Directory      />
        Order   Allow,Deny
        Deny from       All
</Directory>

<Files  ~       "^\.ht">
        Deny from       All
</Files>

NameVirtualHost *:80

<VirtualHost    *:80>
        ServerName      class-3b.ryoou-gakuen.ac.jp
        DocumentRoot    "/var/www/html/class-3b"
        <Directory      /var/www/html/class-3b>
                Order   Deny,Allow
                Allow from      All
        </Directory>
</VirtualHost>

<VirtualHost    *:80>
        ServerName      class-1d.ryoou-gakuen.ac.jp
        DocumentRoot    "/var/www/html/class-1d"
        <Directory      /var/www/html/class-1d>
                Order   Deny,Allow
                Allow from      All
        </Directory>
</VirtualHost>

<VirtualHost    *:80>
        ServerName      teachers-room.ryoou-gakuen.ac.jp
        DocumentRoot    "/var/www/html/teachers-room"
        <Directory      /var/www/html/teachers-room>
                Order   Deny,Allow
                Allow from      All
        </Directory>
</VirtualHost>

TypesConfig     /etc/mime.types
DirectoryIndex  index.html
AddDefaultCharset       off
MimeMagicFile   conf/magic

 なお、Apache2でバーチャルホスト名として使用するだけなら、サーバ側の/etc/hostsにホスト名を記述する必要はまったく無い。

手順5:httpdを起動してテストしてみる
 ここまで完了したら、さっそくserver httpd startしてみよう。(あるいはserver httpd restart)
 http://class-3b.ryoou-gakuen.ac.jp/
 http://class-1d.ryoou-gakuen.ac.jp/
 http://teachers-room.ryoou-gakuen.ac.jp/
 と、それぞれのURLでアクセスすると、表示内容が変化することが確認できるだろうか。

 同一のIPアドレスであるが、httpのプロトコル中に規定されている、「Host」ヘッダに記述されているホスト名を見て判別しているのであった。

 なお、ものすごく古いブラウザあるいは、wgetやcurlコマンド、あるいはtelnetで直接httpポートにアクセスし、Hostヘッダを送信しなかった場合にどうなるのであろうか??Hostヘッダが無ければ、Apacheは「どのサーバ名に対する処理を行えばよいかわからない」はずである。

 実験してみる。Telnetコマンドでhttpポートに直接アクセスしてみる。
[root@kagami conf]# telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
GET /
<html>
<body>
Konata.Izumi<br>
Tsukasa.Hiiragi<br>
Kagami.Hiiragi<br>
Miyuki.Takara<br>
Minoru.Shiraishi<br>
</body>
</html>

Connection closed by foreign host.

 telnetコマンドで、Webサーバの80番ポート(httpのポート)に接続し、「GET /」というコマンドだけを送信している。これで、ドキュメントルートの下にあるindex.htmlが取得される。
 中身を見てみると、どうやら「class-3b」の内容であるように見える。

 実は、Hostヘッダが無かったり、または全てのVirtualHostディレクティブに「マッチしなかった」場合には、一番最初に現れたVirtualHostディレクティブの内容が適用されるという仕様になっているのであった。
 その証拠に、「class-1d」と「class-3b」とのVirtualHostのブロックを入れ替えてhttpdを起動してみた後に、同じくtelnetで直接アクセスを行うと…
[root@kagami conf]# service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]
[root@kagami conf]# telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
GET /
<html>
<body>
Yutaka.Kobayakawa<br>
Minami.Iwasaki<br>
Hiyori.Tamura<br>
Patricia Martin<br>
</body>
</html>

Connection closed by foreign host.

 表示内容が入れ替わっていることが判る。ここではtelnetコマンドでアクセスしているが、wgetやcurlコマンド、あるいはブラウザでIPアドレスを指定してアクセスした場合(http://192.168.0.10/ みたいな感じ)でも同じことが確認できる。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。