Apache 1.3 で virtual host


クライアント側の, なんか楽しげな話とか, テキトーなエッセーとか, ほとんどラクガキばっかりのこのコーナーですが, 久しぶりに役に立ちそうな事を書きましょう. 今回は, apache 1.3 系で, 一個しかないサーバをたくさんあるように見せるという設 定のやりかたです. これを使えば, IP アドレスが一個しかなくても, さもたくさんのサーバがある かのように, 一見すると思えるというのができるのだ. まあ, nslookup とかすれば, すぐばれるんですが, 普通はそんな事しないしね.

つうか, やり方は, 実際にはパッケージ付属の html文書に非常に詳しく載っているので, 別に俺がわざわざ説明するまでもないのです. とくに, 1.3.4の文書は 1.3.3に比べて, 問題の機能にかんしての説明が判りや すくなっているので, まあ, 読めば判るんですけどね. でも, ドキュメントが判りやすくなったというだけでも, 1.3.4を取って来る価 値はあるかも.

以後, apache をインストールしたディレクトリ(configure の PREFIX )を $APACHE と表記します. つまり, 設定ファイルは $APACHE/conf/httpd.conf と書くわけです.

問題の機能は, $APACHE/htdocs/manual/vhosts/index.html から辿れます. このリンクは, デフォルトの prefix を使って apache1.3.4 を すでにインストールしている場合は, そのままつかえます. そうでないと, 404 です. でも, apache を使ってみ ようと思って, この文書をセーブして off line で読む人には, 便利でしょう.

それでは始めましょう.

apache 1.3 系を既に使っている人は, 別に 1.3.4でないといけな いということはないのです. が, とりあえずhttpd をインストールしてくれないと始まらないんでして. 今からインストールする人は, 何かといろいろ機能があった方が面白いので, cofigure のオプションは --enable-module=most --enable-shared=max としま しょう. インストール先とかに, とくに不満のあるひとは, --prefix=/hoge とか してくれ.

インストールするまえに, まえから httpd を使っている人は, まえのを横へど けておこう. そして, make && make install で, できあがりである.

1.3.3は 設定ファイルが httpd.conf 以外に access.conf とか srm.conf とか あったが, それがウザイという評判が立ったらしく, 今回は httpd.confだけに なっている. 確かに, わしも httpd.conf と srm.conf で矛盾する設定を書いた りしたこともあるので, 確かにこの方がいいかもしれん. しかし, そのおかげで httpd.conf は殺人的に長い. わしの設定で 919行である から, わりかし鼻血かも. #include<access.conf> とかできるといいのにな. だったら自分でそうしろって?ごもっとも.

べつに, enabe-moduel=most しなくても, virtual host は使えるようになり ますので, いいんですけど, せっかくですからそうしときましょう. proxy とかにできたりしたら, おもろいやん?

それでは設定じゃ.

  1. NameVirtualHost aaa.bbb.ccc.ddd というのを, <Virtualhost> と </VirtualHost>でかこまれて *いない* ところに書く. 囲まれてないところなら, どこでも構わないのだが, httpd.conf の最後の方に はじめからコメントにして用意してあるので, そのコメントを外せば良い でしょう. aaa.bbb.ccc.ddd にサーバの IPアドレスを代入すること. <VirtualHost>も, その近所に用意してあります.
  2. <VirtualHost>と</VirtualHost>で囲った領域に, 「この名前で呼ばれた 時の設定はこれ」というのを書く. ServerName hogehoge.nirvana.bug と書くと DocumentRoot で指定したディレクトリが, hogehoge.nirvana.bug という名前で接続してきた クライアントから見た rootディレクトリになる.
  3. NameVirtualHost を使うと, <VirtualHost> と </VirtualHost> で囲まれ た部分以外で設定したサーバの設定は, VirtualHost で指定した名前以 外の名前での接続要求に対する応答として使われる. つまり, <VirtualHost>で囲まれてないところで書いた ServerName とか DocumentRoot とかしたのが, デフォルト. 指定してない時は, 最初に出現する VirtualHost がデフォルトサーバ. ドキュメントによると, そのはずだが, 何故か VirtualHost ディレクティブの外側で, ServerName を指定しないと動かない.
  4. ディレクトリ毎にアクセス制限したい場合は, デフォルトで AllowOverride None なので, VirtualHost で提供するディレクトリに関 しては, 何かの設定を書いとこう. たとえば, /hoge というディレクトリを ".htaccess" でアクセス制限し たい場合は, <Directory /hoge> AllowOverride AuthCofig </Directory> というぐあい. そうしないと, .htaccess その他の設定は無視される.
  5. ".htaccess" は, それぞれのVirtualHost の DocumentRoot におき, それぞれ適切に設定 する. ファイルが存在しないと, 何故かデフォルトのサーバの .htaccess が影響を及ぼして来るので ある. ここらへんは, 若干 buggy かも?
  6. 「この名前で呼ばれた時はこのサーバ」というのは, わりと明確でしょう が, 「それ以外」を全部書かないといけないのはあほらしいので, ServerName として _default_ というのが用意されている. つまり, 「このなまえのときは, このディレクトリ」「それ以外はここ」という風 に書けるのである. これは, デフォルトサーバの設定と, やや重複すると ころでもある. 将来どうなるのかな?
  7. それじゃあ apachectrl [re]start といきますか. でも, そのまえに, apachectrl configtest してみると良いかも. 少なくとも Syntax OK が 出ないと, サーバ動かないし.
  8. 思った通りに動かない時は, apachectrl を使うのはなく, httpd を直接に, -S オプションをつけて叩く. つまり, コマンドは $APACHE/bin/httpd -S だ. これで, VirtualHost の設定の読まれ具合が標準出力に表示される.
さて, これが, わしの使っている設定じゃ.
<Directory>
    Options FollowSymLinks
    AllowOverride AuthConfig
</Directory>

NameVirtualHost 192.168.0.1

<VirtualHost 192.168.0.1>
    DocumentRoot /home/yuji/public_html
    ServerName _default_
</VirtualHost>
<VirtualHost 192.168.0.1>
    DocumentRoot /usr/local/apache/htdocs/manual
    ServerName hoge.zabi
</VirtualHost>
これで, http://hoge.zabi で apache のマニュアルが見れ, それいがいは, public_html をみせるというわけだ. 深く考えなければ, 一見, いろんなサーバがあるように見える. でも, IP アド レスは 192.168.0.1 ひとつしか使ってない. ネームサーバのデータベースに は cannonical name で登録した. おっと. 大前提を忘れていたが, 自由になるネームサーバが無いと, この技は使 えないかもです. /etc/hosts だけでも行けるかもしれないけどね. 実験してな いから, わしは知らんのだが. 興味もないし. 実はネームサーバがなくても大丈 夫. くわしくはこちら. (*)

それでは, 使いたい別名を, ネームサーバに登録しましょう. なんせ, せっかく「このなま えで接続してきたら, このディレクトリをみせたろ」とか企んでいても, その名前を IPアドレスに変換できないと通信できないからな. 名前は, A レコードでも CNAME レコードでも, 何でもいいみたいじゃ. それで, ネームサーバにデータベースを読み直させる. これは named にシグナル 1 を 送信すればいい.

これで, 呼ばれた名前ごとに違うディレクトリが見えるようになるはず. いや, もちろん, そのディレクトリが無いとダメですがね.


(*)Wed Feb 17 13:30:00 JST 1999 追加. ノートでも named を設定してあるの で, Off Line でもネームサービスは使えるが, 普段はnamedはとめている. でも, せっかくだから, off line でも使ってみようと思い, /etc/hosts に 127.0.0.1 の適当な名前を追加してみた. On Line の時, つまり, ネットワークインターフェースがあるときと, 同じよ うに動作する. そうそう. ノートパソコンは, ネットワークインターフェースがあったり無かっ たりするので, そこらへんをどう切りぬけるかが, けっこう楽しいですよ.

関係無いですが, apache の設定ファイルは html じみているので, ブラウザ, つうか navigator が勝手に tag だと思いやがって, 画面に出て来ないので, これを表示させるのにちょいと苦労しました. わしは W3C のサイトから持って来た html 4.0 spec を参照して(それに man ascii もね) ascii ナマ書きすることで解決したのだが, こういう情報は, チマタの html本には載っているのでしょうか. それにしても, とりあえず navigator では正しく表示されるようになった (View Page Source すると, html を parse するアルゴリズムが若干見える?) . しかし, w3 のパッケージをどっかにやっちまったので, emacs/w3 で, どう表示されるのかわからない. lynx では正しく表示された.