このページではLinux上でApache/httpdを使ってWebサーバー構築するために必要なコンテナディレクティブの書式について解説します。
お便利サーバー.com+相互リンクサイト内をキーワードで検索
Webサーバーの構築

Webサーバーについて

Apacheの構成と設定の準備

全般的な動作環境の設定

コンテナディレクティブの形式

コンテナディレクティブの設定

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

ユーザーディレクトリの設定

バーチャルホストの設定

CGIの実行許可の設定

ユーザー認証機能の設定

httpdのコントロール

httpdの動作チェック

ポートフォワーディングの設定


コンテナディレクティブとは

httpd の設定全般において、設定対象のファイルやディレクトリが複数であったり、ある範囲をもっていたりする場合、それらの設定対象に複数の共通した設定を行いたいケースが非常にたくさんあります。

例えば、「このファイルはパスワードを教えている特定のメンバーにだけ見せるようにしたい。」とか「このディレクトリ以下は自宅内以外からはアクセスさせたくない。」とか、簡単なところではそういう制御です。

ここに、[設定対象1]、[設定対象2]...という複数の異なるディレクトリがあるとします。そしてそれぞれに、[ディレクティブ1]、[ディレクティブ2]、という異なる設定を与えたい場合があるとします。

これを多くのサーバーアプリケーションの設定ファイルで用いられる一般的な形式、つまり 「左端を ディレクティブ から記述する」 という書き方で設定しようとすると、

[ディレクティブ1] [値] [設定対象1] [設定対象2] ...
[ディレクティブ2] [値] [設定対象1] [設定対象2] ...

という具合に記述しなければならなくなります。

こういう記述方法は設定の状態が解りにくいだけではなく、設定対象の増減や、ディレクティブの追加作業はとても面倒です。

"/etc/httpd/conf/httpd.conf" ではこのような面倒を避けるため、

<[範囲のパターンを指定するディレクティブ名] [設定対象]>
 [ディレクティブ1]
 [ディレクティブ2]
</[範囲のパターンを指定するディレクティブ名]>

という記述形式が準備されています。

この記述形式は、特定の名前のディレクトリに対して自動的に同じ設定を与えたり、入れ子になっているディレクトリに特殊な設定を与えたり、ということを直感的に作業できるように工夫されているわけです。

位置指定型のコンテナディレクティブ

httpd は多くの場合、 構築中のLinuxサーバー 上のディレクトリ単位で様々な設定を行います。

このような場合、 "/etc/httpd/conf/httpd.conf" 中では、

<[範囲形式の ディレクティブ 名] [設定対象]>

から、

</[範囲形式のディレクティブ名]>

の間にいくつかの別のディレクティブの記述し、該当する範囲に特有の設定を行うことができるようになっています。

<Directory ...>〜ディレクトリ式コンテナ

最も多く利用される形式のコンテナです。

例えば、

<Directory /var/www/html>
 [ディレクティブ1]
 [ディレクティブ2]
</Directory>

と記述した場合、 "/var/www/html/" 以下のディレクトリやファイルに対する制御を、[ディレクティブ1]、[ディレクティブ2]に記述することになります。

ディレクトリ名には、 ワイルドカード Perl 互換の 正規表現 が使用できますから、例えば、

<Directory /var/www/html/photo*>
 [ディレクティブ1]
 [ディレクティブ2]
</Directory>

と記述した場合は、 "/var/www/html/" 以下の "photo" で始まる名前のディレクトリが設定対象となります。

ただしワイルドカードは、ディレクトリの区切り記号の "/" は対象に含めませんから注意してください。

また、正規表現を用いるときは、次のように "~(チルダ)" を入れる必要があります。

<Directory ~ "正規表現の記述">
 [ディレクティブ1]
 [ディレクティブ2]
</Directory>

さて、例えば、階層が上下の関係にある二つのコンテナが

<Directory /var/www/html>
 [ディレクティブ1]
 [ディレクティブ2]
</Directory>
<Directory /var/www/html/photo>
 [ディレクティブ1x]
</Directory>

と記述され、[ディレクティブ1]と相反する設定が[ディレクティブ1x]に行われた場合、 "/var/www/html/photo/" 以下のディレクトリとファイルには[ディレクティブ1x]と[ディレクティブ2]が有効になり、それを除く "/var/www/html/" 以下のディレクトリとファイルには[ディレクティブ1]と[ディレクティブ2]が有効になります。

<Directory>コンテナには「ディレクトリの上位から順番に記述する」というような決まりはありませんし、通常は連続して記述する必要もありません。従って、

<Directory /var/www/html/photo>
 [ディレクティブ1x]
</Directory>
全く別のディレクティブ
<Directory /var/www/html>
 [ディレクティブ1]
 [ディレクティブ2]
</Directory>

でも設定の結果は同じになります。

ただし例外として、全く同じディレクトリを指し示すコンテナが複数記述された場合は、後に記述されたコンテナ内のディレクティブが有効になりますので、

<Directory /var/www/html/photo>
 [ディレクティブ1]
 [ディレクティブ2]
</Directory>
<Directory /var/www/html/photo>
 [ディレクティブ1x]
</Directory>

の場合は、[ディレクティブ1x]と[ディレクティブ2]が、

<Directory /var/www/html/photo>
 [ディレクティブ1x]
</Directory>
<Directory /var/www/html/photo>
 [ディレクティブ1]
 [ディレクティブ2]
</Directory>

の場合は、[ディレクティブ1]と[ディレクティブ2]がそれぞれ有効になります。

ただし、そういう記述方法は設定内容をわかりにくくするだけであまり有用性はありません。

一つのディレクトリに対するコンテナは、できるだけ一つにして記述するように心掛けてください。

また、

<Directory /var/www/html/>
 [ディレクティブ1]
 [ディレクティブ2]
 <Directory /var/www/html/photo>
  [ディレクティブ1]x
 </Directory>
</Directory>

のように、複数のディレクトリコンテナ同士を「入れ子」にすることはできません。

<Files ...>〜ファイル名式コンテナ

ファイル名に対して制御を行うコンテナです。

正規表現を用いるには、ディレクトリ式コンテナと同様に、
"<Files ~ "正規表現">"
とする必要があります。

ファイル名には、 ワイルドカード Perl 互換の 正規表現 も使用できます。

例えば、

<Files private.html>
 [ディレクティブ1]
 [ディレクティブ2]
</Files>

と記述すると、原則としてファイルシステム上の任意の位置にある "private.html" が[ディレクティブ1]と[ディレクティブ2]の設定対象となります。

特定のディレクトリ範囲にあるファイルを対象にしたい場合は、

<Directory /var/www/html/photo>
 [ディレクティブ1]
 [ディレクティブ2]
 <Files private.html>
  [ディレクティブ3]
 </Files>
</Directory>

のように、ディレクトリ式コンテナの「入れ子」として記述します。これで、 "/var/www/html/photo" 以下の階層にある"private.html"だけが設定対象になります。

ただ、この形式のコンテナは一般にはあまり使われることはありません。

用途としては、例えば第三者から見られてはいけない管理用ファイルを、同じファイル名で各ディレクトリに配置し、自宅の LAN だけから参照できるように プライベートIPアドレス からの接続にのみ参照許可を与える、といった使い方になるでしょうか。

<Location ...>〜web空間式コンテナ

ディレクトリ型コンテナに似ていますが、ディレクトリ型コンテナが 構築中のLinuxサーバー のファイルシステム上の 絶対パス を指定するのに対し、このコンテナは httpd コンテンツ を配信するときのすべての URL を基準として設定されます。

例えば、

<Location /private>
 [ディレクティブ1]
 [ディレクティブ2]
</Location>

とした場合、 クライアント 側から、

"http://[ FQDN ]/private/"

と要求があった場合に送信対象となるディレクトリが設定対象となります。

具体的にいえば、クライアントからのアクセス先が、

"http://www.obenri.com/private/"

だとすると、 "DocumentRoot" ディレクティブ DocumentRootディレクティブ の設定が デフォルト の"/var/www/html"の場合は、"/var/www/html/private"が設定対象となります。

ここでもしも、"DocumentRoot"ディレクティブを"/var/www/doc"に変更した場合、設定対象は自動的に"/var/www/doc/private"に変更になります。

もちろん、たったこれだけのことならばディレクトリ式コンテナでも「ちょっと設定を書き換える」だけの手間で済みますから、あまり有用性は感じないかもしれません。

ただし、web空間式コンテナの設定は、httpdが受付可能なすべてのURLが対象になりますから、 バーチャルホスト を多用するときに本当の威力を発揮します。

例えば、

"httpd://tanaka.obenri.com/"

というバーチャルホストを、 "/home/tanaka/public_html" をドキュメントルートとして公開した場合、

"httpd://tanaka.obenri.com/private/"

に該当するディレクトリ "/home/tanaka/public_html/private" も自動的に設定対象となるわけです。

このweb空間式コンテナは、公開するURL上の同じ名称のディレクトリを自動的に設定対象にできますから、ディレクトリ単位でデータ出力を行う管理用 アプリケーション の出力先ディレクトリにアクセス制限をかける、という用途に適します。

ただし、このweb空間式コンテナはあまり多用すべきではありません。

web空間式コンテナは、ファイルシステムに対しては「相対的に」設定されますので、「絶対的に」設定される他のコンテナにうっかり変更を行ってしなうと、思わぬセキュリティホールを生じかねません。

また、 WBEL CentOS 自身で設定する シンボリックリンク や httpdで設定する エイリアス などと設定対象が重なってしまうと、予想外の動作をしてしまうことがありますので、取り扱いには注意が必要です。

正規表現を用いるには、ディレクトリ式コンテナと同様に、
"<Location ~ "正規表現">"
とする必要があります。

このweb空間式コンテナでも、 ワイルドカード Perl 互換の 正規表現 が使用できますが、同様の理由からできるだけ「複数の対象と一致させる」ような使用方法は避けたほうが良いでしょう。

位置指定型のコンテナディレクティブについて諸々

位置指定型のコンテナ ディレクティブ は、設定対象の指定に 正規表現 が使用できますが、実は上で説明した3種類のコンテナディレクティブにはそれぞれ正規表現専用で用いる、

<DirectoryMatch " ">
 [ディレクティブ]
</DirectoryMatch>

<FilesMatch " ">
 [ディレクティブ]
</FilesMatch>

<LocationMatch " ">
 [ディレクティブ]
</LocationMatch>

が用意されています。

これらを使用するときは "~(チルダ)" 記号は不要です。正規表現を用いる場合はどちらを使っても構いませんが、できるだけこれらのコンテナを使うことが推奨されているようです。

上のディレクトリ式コンテナでも説明しましたが、設定対象として全く同じコンテナが複数記述されている場合は、後の記述が有効になります。

さて、これらの6種類のコンテナには、 "/etc/httpd/conf/httpd.conf" の中では記述の順序はありません。

httpd は起動の際に、コンテナの記述を一度全て読み込み、ファイルシステム上で上位に位置するものから順々に設定を適用していくからです。

ただ、だからといって思いつきで適当な場所に記述してしまうと、後から収拾がつかなくなる恐れがありますから、できるだけ上位のディレクトリに対するコンテナから順に記述するよう心がけましょう。

このページの先頭へ↑

その他のコンテナディレクティブ

<VirtualHost ...>〜バーチャルホストの指定

httpd バーチャルホスト として コンテンツ を配信するときに用います。

バーチャルホストの運用は、コンテナの設定以外にもいくつかの設定が必要ですので、 バーチャルホストコンテナの設定 で詳しく説明します。

<Limit ...>〜指定したHTTPメソッドの制御

このコンテナは、 HTTPメソッド の一部に利用制限をかけたい場合に用います。

通常は、制限をかける対象となるディレクトリ式コンテナの「入れ子」として記述します。

例えば、

<Directory /var/www/html/suzuki>
  [ディレクティブ1]
  [ディレクティブ2]
 <Limit GET POST OPTIONS>
  [ディレクティブ3]
  [ディレクティブ4]
 </Limit>
</Directory>

と記述した場合、 "DocumentRoot" DocumentRootディレクティブ "/var/www/html" の場合、 "http://www.obenri.com/suzuki/" 以下に対して、 "GET" "POST" "OPTIONS" の三つのHTTPメソッドについて、[ディレクティブ3]、[ディレクティブ4]のアクセス制限などが適用されます。

記述されていないHTTPメソッドについては制御を行いません。

このコンテナは、信頼のできない第三者にホームページの コンテンツ スペースを貸し出すような場合、コンテンツ内検索フォームやメール配信フォームなどの利用を制限するときに用います。

この <Limit ...> コンテナは、自身がサポートしているHTTPメソッド以外は制御できませんので、HTTPメソッドに対して厳密なアクセス制御を行うときは次の <LimitExcept ...> と併用する必要があります。

<LimitExcept ...>〜指定外のHTTPメソッドの制御

このコンテナは、指定されていない HTTPメソッド の制御を行います。つまり、 <Limit ...> の裏の動作を制御します。

例えば、

<Directory /var/www/html/suzuki>
  [ディレクティブ1]
  [ディレクティブ2]
 <LimitExcept GET POST OPTIONS>
  [ディレクティブ3]
  [ディレクティブ4]
 </Limit>
</Directory>

と記述した場合、 "http://www.obenri.com/suzuki/" 以下に対して、 "GET" "POST" "OPTIONS" の三つ以外のすべてのHTTPメソッドについて、[ディレクティブ3]、[ディレクティブ4]のアクセス制限などが適用されます。

<LimitExcept ...> は、 <Limit ...> で制御できない未サポートのHTTPメソッドを制御対象とできます。

<IfModule ...>〜モジュールの設定

httpd は非常にたくさんのモジュール(補助プログラム)が組み合わされて動作します。

"/etc/httpd/conf.d/"以下に設定ファイルを置くときは、そのための設定を"httpd.conf"に記述する必要があります。ちょっとややこしいですか?。

それぞれのモジュールの設定は、 "/etc/httpd/conf/httpd.conf" に直接記述するか、または "/etc/httpd/conf.d/" 以下に別の設定ファイルで記述します。

ただ、実際には組み込まれていないモジュールに対して、 "/etc/httpd/conf/httpd.conf" に固定的に設定を記述してしまうとエラーになってしまいます。

この <IfModule ...> コンテナは、例えば、

<IfModule mod_userdir.c>
  [ディレクティブ1]
  [ディレクティブ2]
</IfModule>
ちなみに"mod_userdir.c"は、ユーザーディレクトリでコンテンツを公開できるようにするためのモジュールです。

と記述した場合、もし "mod_userdir.c" というモジュールが組み込まれていれば[ディレクティブ1]、[ディレクティブ2]を適用し、組み込まれていない場合は無視するように振舞います。

このコンテナを実際に書き換えることはまずないと思いますが、 デフォルト の"/etc/httpd/conf/httpd.conf"の中で頻繁に登場しますので、「そういう意味のコンテナ」とだけ覚えておいてください。

このサイトは既に更新を終了していますが、今のところ店じまいの予定はありません。 リンクフリー ですので、趣味や勉強のためでしたら、引用、転用、コピー、朗読、その他OKです。このサイトへのリンクについては こちら をご覧ください。
Powered by Apache
”Linux”は、Linus Torvalds 氏の各国における登録商標です。”Red Hat”及びRed Hatのロゴおよび Red Hat をベースとしたすべての商標とロゴは、各国におけるRed Hat, Inc. 社の商標または登録商標です。その他のプログラム名、システム名、製品名などは各メーカー、ベンダの各国における登録商標又は商標です。
www.centos.org - The Community ENTerprise Operating System