WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

Web サーバーの構築 : Apache のより実用的な設定

今日は、昨日に続いて Apache 関連のネタを続けます。今日はバーチャルホストの設定方法をはじめとして、実際に使用する際に必要となりそうな設定をご紹介しようと思います。

ドキュメントルートの設定

標準では Web サイトのデータは "/var/www/localhost/htdocs" 以下に保存されていますが、これを変更したい場合は多いでしょう。GentooLinux の場合、Apache は最初からバーチャルホストに対応するように記述されていますので、ドキュメントルート(Web ページを格納するディレクトリ)は "/etc/apache2/vhosts.d/00_default_vhost.conf" で設定します。

たとえば、ドキュメントルートを "/var/www/mysite/htdocs" にしたい場合は、以下の部分を変更します。

DocumentRoot "/var/www/mysite/htdocs"
<Directory "/var/www/mysite/htdocs">

バーチャルホストの利用

バーチャルホスト」とは、1 台のサーバーで複数のドメインの Web サイトを干すとする機能です。Apache には、標準でバーチャルホスト機能が実装されています。ここでは、以下の 2 つのドメインをホストすることを前提にして、バーチャルホスト機能の利用方法をご紹介します。

ドメインドキュメントルート
www.sourcewalker.com/var/www/main/htdocs
sub.sourcewalker.com/var/www/sub/htdocs

また、Apache の動いているサーバーの FQDN は "www.sourcewalker.com" で、1 番目のバーチャルホストと同じだと仮定します。

デフォルトとなるホストの設定

GentooLinux の設定では、"00_default_vhost.conf" に記述されたホストがデフォルトホストとなります。つまり、バーチャルホスト として明示的に設定していないホスト名、もしくは IP アドレス直指定でアクセスされた場合に "00_default_vhost.conf" の設定が使用されます。そのため、"00_default_vhost.conf" には最もメインとなるホストの設定を記述するのが普通です。今回は、"www.sourcewalker.com" の設定をここに記述しましょう。設定方法は「ドキュメントルートの設定」と同様です。

バーチャルホストの追加

それでは、"sub.sourcewalker.com" の設定を追加しましょう。GentooLinux では "/etc/apache2/vhosts.d" に以下の形式のファイル名でバーチャルホストの設定ファイルを作成するのが良いと思います。

<優先順位>_<名前>_vhost.conf
優先順位
2 桁の数字で、この値が小さいものから設定が読み込まれます。
名前
任意の名前です。わかりやすいようにつけてかまいません。

"00_default_vhost.conf" もこの形式に従っていますね。では、この形式に従って、"sub.sourcewalker.com" の設定ファイルは "01_sub_vhost.conf" としましょう。内容は以下のようにします。

<VirtualHost *:80>
    ServerName sub.sourcewalker.com
    DocumentRoot "/var/www/sub/htdocs"
    <Directory "/var/www/sub/htdocs">
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

VirtualHost セクションコンテナはバーチャルホストの設定を記述するためのものです。この記述はおまじないとして覚えてしまいましょう。唯一、アクセスに使用するポートや IP アドレスを変更する場合は、"*:80" の部分を変更する必要があります。

ServerName ディレクティブでバーチャルホストのホスト名を指定します。DocumentRoot の意味は前述のとおりです。その他のディレクティブの意味は後述します。

DNS の設定

バーチャルホスト をきちんと機能させるためには、DNS で各バーチャルホストのホスト名を Apache が動作しているサーバーの IP アドレスに解決してやらねばなりません。使用している DNS サーバーが BIND で、"www.sourcewalker.com" がすでに A レコードで登録されているとすれば、正引きゾーンファイルに以下の記述を追加すればよいはずです。

sub IN CNAME www

このあたりの詳細は DNS サーバーの構築(その2:正引きゾーンファイルの作成) をご参照ください。また、VALUE DOMAIN のレンタル DNS サーバーを利用している場合の情報は、こちらのページにあります。

CGI の利用

Apache では、セキュリティー上への配慮から標準では CGI が利用できない設定になっています。CGI を利用するためには、まず "httpd.conf"CGI のハンドラを有効にし、ディレクトリごとの設定で CGI の利用を許可しなければなりません。

前者については、前回の記事 での設定例を参照してください。「/etc/apache2/httpd.conf の設定例」の部分です。後者の設定方法には、Options ディレクティブでディレクトリごとに許可する方法と ScriptAlias ディレクティブを利用する方法の 2 種類がありますので、個別にご説明します。

Options ディレクティブを利用する

Options ディレクティブは各ディレクトリで利用できる機能を制限するためのもので、以下の設定を個別に ON/OFF できます。いくつかの指定が可能ですが、CGI を許可するためには "Options ExecCGI" とします。通常は DirectoryLocation セクションコンテナの内部に記述します。例えば、前述のバーチャルホストの設定で "sub.sourcewalker.com" 内のすべての場所で CGI を利用できるようにするには、"01_sub_vhost.conf" を以下のように記述します。

<VirtualHost *:80>
    ServerName sub.sourcewalker.com
    DocumentRoot "/var/www/sub/htdocs"
    <Directory "/var/www/sub/htdocs">
        Options ExecCGI
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

ただし、Web コンテンツと CGI スクリプトが同じ場所に混在するのはセキュリティー的には好ましいことではありません。Web コンテンツと CGI スクリプトの作成権限を分離できませんし、Web サーバーの設定ミスなどで CGI スクリプトのソースを晒してしまう危険が高くなります。運用上の問題がなければ、後述の ScriptAlias を使うほうが好ましいと思います。

ScriptAlias ディレクティブを利用する

ScriptAlias は、CGI スクリプトを格納するための専用のディレクトリを指定するディレクティブです。CGI と通常の Web ページを分離できるので Options ディレクティブを利用する方法よりも安全です。ScriptAlias の書式は以下のとおりです。ScriptAliasVirtualHost セクションコンテナの内部に記述します。

ScriptAlias <マッピング先> <ディレクトリ>

例として、"sub.sourcewalker.com" で "/var/www/sub/cgi-bin" を CGI 専用のディレクトリとする設定は以下のようになります。

<VirtualHost *:80>
    ServerName sub.sourcewalker.com
    DocumentRoot "/var/www/sub/htdocs"
    ScriptAlias /cgi-bin/ /var/www/sub/cgi-bin/
    <Directory "/var/www/sub/htdocs">
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

これで、"http:sub.sourcewalker.com/cgi-bin/xxx.cgi" のような URLCGI を実行できるようになります。注意点として、CGI を格納するディレクトリはドキュメントルートの外に設定しなければなりません。でないと、Options ディレクティブを利用する方法と同じ結果になってしまいます。

特定ホストからのみアクセス可能にする

特定のディレクトリ以下(もしくは特定のバーチャルホスト)はローカルネットワーク内からしかアクセスできないようにしたい、という場合はけっこう多いと思います。それを実現するには、Order, Allow, Deny の 3 つのディレクティブを組み合わせます。

Allow, Deny ディレクティブの書式は同じで、以下のようになります(実際にはもう少しバリエーションがあります)。

Allow from <ホスト名 or IPアドレス>

ホスト名は後方一致、IP アドレスは前方一致です。つまり、"sourcewalker.com" と指定すれば "sourcewalker.com" のすべてのサブドメイン(sourcewalker.com 自身を含む)になりますし、"192.168.0" と指定すれば IP アドレスが 192.168.0.0 〜 192.168.0.255 の範囲のすべてになります。また、"all" を指定するとすべてのホストを指定したことになります。

Order ディレクティブは "Order allow,deny" と "Order deny,allow" の 2 種類の指定があります("Mutual-failure"という指定もありますが、非推奨です)。Allow, Deny の指定をどの順番で評価するか、という意味です。どちらの場合も常に両方が(指定された順番で)評価され、最後にマッチしたほうが適用されます。

例えば、"sub.sourcewalker.com" で 192.168.0.* からのみアクセスを許したい場合は、以下のようにします。

<VirtualHost *:80>
    ServerName sub.sourcewalker.com
    DocumentRoot "/var/www/sub/htdocs"
    ScriptAlias /cgi-bin/ /var/www/sub/cgi-bin/
    <Directory "/var/www/sub/htdocs">
        Order deny,allow
        Deny from all
        Allow 192.168.0
    </Directory>
</VirtualHost>

Apache にはまだまだたくさんの機能がありますが、ここではこのくらいで済ましておこうかなと思います。日本語訳されたユーザーマニュアルをはじめとして、Web 上に優れた解説がたくさんありますので、皆さんも研究してみてください!(^^)

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles