2005-05-14

httpd.confの編集

以下では、httpd.conf について説明しますが、その内容は本編の目的である「テスト用のローカルWebサーバの構築」です。従って、設定内容自体は公開用のWebサーバには当てはまりませんが、Apacheの設定方法に関してはある程度の参考になると思います。

インストール直後のhttpd.conf は全体で約 1,000行あります。そのうち、行頭に # (シャープ記号)の付いた行はコメント行です。実際には、# が行頭にない行が有効な設定になります。httpd.conf は、次の3つのセクションから構成されています。尚、Apacheでは、バーチャルホスティングによって扱われる仮想サーバに対して本来のWebサーバの事をメインサーバと呼んでいます。

(Section 1)Global Enviroment ----------- Webサーバ全体の動作環境に関する設定
(Section 2)Main server configuretion --- メインサーバに関する設定
(Section 3)Vertual Hosts --------------- 仮想サーバに関する設定

以下では、本編の目的である「テスト用のローカルWebサーバの構築」を行うための設定内容を、httpd.conf で出現するディレクティブの順に挙げます。尚、ここでは、インストール後に変更したもの及び説明のために特に重要と思われる主要な設定内容のみを挙げています。尚、仮想サーバに関する設定はありません。

Global Enviroment (Webサーバ全体の動作環境に関する設定)

サーバのインストールディレクトリ

ServerRoot "C:/usr/Apache2"

ServerRoot ディレクティブは、 サーバのインストールディレクトリを設定します。通常、この中にはconf/ や logs/ といったサブディレクトリが存在します。httpd.conf に記述する他の設定ファイルの相対パスは、このディレクトリからになります。

Keep-Alive

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15

KeepAliveディレクティブはHTTP の持続的な接続(Keep-Alive)を有効(On)にします。無効にする場合はOffを指定します。MaxKeepAliveRequestsはKeep-Alive有効時の一回の接続で受付け可能なリクエストの数を指定します。この値を0 にすると、受付けリクエストは無制限になります。 KeepAliveTimeoutはKeep-Alive 有効時に次のリクエストが来るまでサーバが待つ時間(秒)を指定します。

httpのリスニング

Listen 80

Listen ディレクティブは Apache がリスニングするIP アドレスとポート番号を指定します。

構文: Listen [IP-address:]portnumber

IPアドレスの指定がない場合、全インターフェースのリクエストに応答します。 Listen ディレクティブは必須のディレクティブで、設定ファイルに指定がなければ、サーバは起動に失敗します。本編でのApacheのインストールの説明で、「後でhttpd.confを編集すれば、Apacheのリスニングポートを8080などに変更できます。」と書きましたが、これをするには、

Listen 8080

と変更し、後で説明するServerNameディレクティブを変更して下さい。また、複数のIPアドレスやポートに対してリスニングする事もできます。例えば、80番と8080番のポートをリスニングするには以下のようにします。

Listen 80
Listen 8080

Main server configuretion (メインサーバに関する設定)

管理者メールアドレス

ServerAdmin webmaster@water-sunlight.com

ServerAdminディレクティブには、サーバエラー発生時にブラウザに表示するエラーメッセージ中に記述する電子メールアドレスを設定します。

サーバのIPアドレスとポート番号

ServerName localhost:80

ServerName ディレクティブには、サーバが自分自身を示すホスト名とポートを設定します。 これは、リダイレクトする URL を生成する際に利用されます。公開用途でApacheを用いる場合は、DNS名を用いて

ServerName www.water-sunlight.com:80

のように記述しますが、本編では上のようにローカルホストを設定します。

ServerNameが指定されていないときは、 サーバは IP アドレスから逆引きを行なうことでホスト名を解決します。また、ServerName にポートが指定されていないときは、 サーバはリクエストが来ている ポートを使います。逆引きの手間を省く為にもServerName を使ってホスト名とポートを明示的に指定する方が信頼性が高まります。

ドキュメントルート

DocumentRoot "D:/WWWRoot"

DocumentRootディレクティブには、ドキュメントルートを設定します。ApacheはURLパスがAliasまたはScriptAliasディレクティブにマッチしない場合には、ここで設定した物理パスに、リクエストされたURLパスを付加して物理パスを生成します。DocumentRoot には最後のスラッシュを指定してはなりません。Apache Windows版のデフォルトは、

DocumentRoot "{Apacheインストールホルダー}/Apache2/htdocs"

です。

デフォルトのアクセス制御

<Directory />
  Options None
  AllowOverride None
  Order Allow,Deny
  Deny from All
</Directory>

httpd.conf のこの辺からいよいよメインサーバに関するアクセス制御の中核に入っていきます。<Directory />ブロックはApacheインストール時に初期設定されます。この設定は全ての物理ディレクトリに対するアクセス制御(即ちデフォルトのアクセス制御)を表しています。
初期設定では

Options FollowSymLinksドキュメントディレクトリ中のシンボリックリンクを許可します
AllowOverride Noneアクセス制御ファイル(.htaccess)によるアクセス制御を全て禁止します

になっています。Optionsの設定をNoneに変更し全てのアクセス制御オプションを無効にしています。また、このままでは「Order Deny,Allow(全てのホストからのアクセス許可)」がデフォルトとして適用されてしまいます。ローカルサーバと言えども、セキュリティ面を考え以下のディレクティブを追加します。

Order Allow,Denyホストからのアクセスをデフォルトで拒否し、Allow,Denayの順に評価します
Deny from All全てのホストからのアクセス拒否します

このように、一旦、全てのホストからのアクセスを拒否しておいて、後で個別のドキュメントディレクトリに対して個別にアクセスを許可していきます。尚、最後の Deny from All は(Order Allow,Denyはホストからのアクセスをデフォルトで拒否するので)本来不要ですが、明示的に記述しました。

Options, AllowOverride, Order, Allow, Denyの各ディレクティブの詳細は「付録 アクセス制御ディレクティブ」を参照して下さい。

ドキュメントルートのアクセス制御

<Directory "D:/WWWRoot">
  Options All
  AllowOverride All

  Order Allow,Deny
  Allow from localhost
  Allow from 192.168.1.0/24
</Directory>

DocumentRootで設定したドキュメントルートに対するアクセス制御を設定します。まず、

Options Allインデックス作成、シンボリックリンク、CGI/SSIの実行など全てのオプションを許可します
AllowOverride Allアクセス制御ファイル(.htaccess)によるアクセス制御を全て許可します

として、全てのアクセス制御オプションを許可します。次に、

Order Allow,Denyホストからのアクセスをデフォルトで拒否し、Allow,Denyの順に評価します
Allow from localhostローカルホストからのアクセスを許可します
Allow from 192.168.1.0/24LAN内の特定のホストからのアクセスを許可します

として、ローカルサーバの使用を制限します。この設定は、公開用サーバなどの設定とはまったく異なります。テスト用のローカルサーバを設定しているので、「特定のホストからしかアクセスできないが、アクセスできるホストには全てのアクセス制御オプションを与える」を基本的な考え方としています。

Options, AllowOverride, Order, Allow, Denyの各ディレクティブの詳細は「付録 アクセス制御ディレクティブ」を参照して下さい。

ファイアウォール

最近ではパーソナルファイアウォールの入っているパソコンは珍しくありません。上の設定のようにLAN内の特定のホストからWebサーバへのアクセスを許可するにはApacheの設定だけでは上手くいきません。この場合、Webサーバで使用しているポートに対するアクセス許可をパーソナルファイアウォールで行う必要があります。パーソナルファイアウォールの設定を参照して下さい。

ユーザディレクトリ

UserDir "D:/Apatch Users/*"
UserDir disabled
UserDir enabled user1 user2

<Directory "D:/Apatch Users/*">
  Options All
  AllowOverride All

  Order Allow,Deny
  Allow from localhost
  Allow from 192.168.1.0/24
</Directory>

UserDirでユーザディレクトリを既定の場所(C:/Documents and Settings/user )からにD:/Apatch Users/user に変更し、特定のユーザ(sunlightとtestuser)にのユーザディレクトリの使用を許可します。初期設定では、

UserDir "My Documents/My Website"

になっています。この場合のユーザディレクトリは"C:/Documents and Settings/user/My Documents/My Website"になります。UserDirでユーザディレクトリを設定してもクライアントからはアクセスできません。なぜなら、本編では、デフォルトのアクセス制御(<Directory />)で全てのアクセスを拒否しているからです。従ってユーザディレクトリに対してもアクセスを許可する必要はあります。ここでは、ドキュメントルートと同じ設定をユーザディレクトリに対しても行っています。(テスト用のローカルサーバなのでユーザディレクトリを使用する機会はほとんどないと思いますが)

インデックスファイル

DirectoryIndex index.html index.html.var index.cgi index.php

DirectoryIndex ディレクティブでは、クライアントが「/」 で終わるURLパスを要求(ディレクトリインデックス要求)した 場合に探すファイル名を設定します。複数のファイル名をスペースで区切って指定する事ができます。複数指定されている場合は、前に記述したものが優先されます。ここで指定したファイルが見つからず、Option Indexes が設定されている場合、Apacheはディレクトリリストを生成します。

ここでは初期の設定にindex.cgiとindex.phpを追加しました。

尚、index.html.varは、Apacheがコンテントネゴシエーションを提供するための.varファイルです。コンテントネゴシエーションとは、ブラウザにより提供されたメディアタイプ、言語、文字セットなどのネゴシエーション情報に基づいて、最適なリソースをWebサーバが選択ための機能です。

特別なファイルの保護

AccessFileName .htaccess
<Files ~ "^\.ht">
  Order allow,deny
  Deny from all
</Files>

AccessFileNameディレクティブは、アクセス制御ファイルの名前を設定します。このファイル名は既定では.htaccessです。このようにApacheでは.htで始まるファイルを特別視するのが習慣のようです。このような特別なファイルを保護するためには、<Files ~>ブロックを作り全てのホストからのアクセスを拒否します。<Files ~>ブロック内の "^\.ht" は正規表現で、「.htで始まるファイル」の意味です。正規表現についてはPerl に関する文献などを参照して下さい。

この設定はインストール時のもので変更していません。

エラーログ

ErrorLog logs/error.log
LogLevel warn

ErrorLogでエラーログファイル名を、LogLevelでエラーログのレベル(重要度)を指定します。Perlなどのテストではエラーログファイルを見る機会も多いと思います。この設定はインストール時のもので変更していません。

アクセスログ

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

CustomLog logs/access.log common

CustomLog ディレクティブはクライアントのHTTPリクエストのログ収集を指定します。この設定はインストール時のもので変更していません。

この設定で、実際に有効なのは以下の部分です。

LogFormat "%h %l %u %t \"%r\" %>s %b" commonログ形式を指定し、形式に名前(common)を付けます
CustomLog logs/access.log common指定のログ形式(common)でログファイルを作ります

common以外の形式(combined/referer/agent)も定義してあります。公開用のWebサーバなどでは、目的と必要に応じてログファイルを追加します。

CGIディレクトリ

# ScriptAlias /cgi-bin/ "C:/usr/Apache2/cgi-bin/"

# <Directory "C:/usr/Apache2/cgi-bin">
#     AllowOverride None
#     Options None
#     Order allow,deny
#     Allow from all
# </Directory>

ScriptAliasディレクティブはAliasと同様にDocumentRoot 外にドキュメントディレクトリをマッピングする為に使用します。Aliasディレクティブとの違いは、ApacheはScriptAliasで指定されたディレクトリ下にあるファイルをCGI プログラムとして扱い、実行を試みます。

本編では、全てのドキュメントディレクトリでCGIの実行を許可します。従って、CGI専用のディレクトリは必要なく、ScriptAliasの関するインストール時の初期設定を全てコメントアウトして無効にしています。

CGIプログラムの拡張子

AddHandler cgi-script .cgi .pl

AddHandlerディレクティブはファイル名の拡張子を特定のハンドラにマッピングします。この設定は、拡張子(cgiとpl)をCGI スクリプトとして扱うために、ハンドラcgi-script にマッピングします。また、CGIとして実行するためにはOptions ExecCGI を使用してCGIプログラムの実行を許可しなければまりません。本編のドキュメントディレクトリの設定は Options All なので、Options ExecCGI も含んでいます。

ハンドラ

ハンドラとは、ファイルにマッピングされた「実行される動作」を表します。ハンドラはモジュールに組み込んだり、Action ディレクティブとして追加したりすることができます。以下に標準で組み込まれている主なハンドラを挙げます。

ハンドラ名実行される動作典型的な拡張子
send-as-isHTTP ヘッダのあるファイルをそのまま送ります.asis
cgi-scriptCGI スクリプト.cgi
imap-fileイメージマップのルールファイル.map
type-mapコンテントネゴシエーションのタイプマップ.var


最終更新のRSS Last-modified: Wed, 18 Jan 2006 12:31:58 JST (4347d)