Web サーバーの構築 : 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" とします。通常は Directory や Location セクションコンテナの内部に記述します。例えば、前述のバーチャルホストの設定で "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 の書式は以下のとおりです。ScriptAlias は VirtualHost セクションコンテナの内部に記述します。
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" のような URL で CGI を実行できるようになります。注意点として、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 上に優れた解説がたくさんありますので、皆さんも研究してみてください!(^^)
詳しくはこちらの記事をどうぞ!
この記事にコメントする