オフィシャルサイト: Apache.org
オフィシャルドキュメント: Apache 2.0

Apache (httpd)

移転しました

独自ドメインサイトへ移行しました。5秒後に

https://straypenguin.winfield-net.com/

へジャンプします。

Table of Contents

設定ファイル

中枢となる設定ファイルは /etc/httpd/conf/httpd.conf だが、この httpd.conf の中で include ディレクティブを使って、他の設定ファイルを追加で読み込ませることも可能 (よく使われる場所は /etc/httpd/conf.d/ )。基本的にはどのファイルに書いても同じ (ただし includeinclude 句の書いてある位置にインクルードファイルを読み込むのでどの位置で唱えるかは重要)。さらにまた、一部のディレクティブは、実際のコンテンツをサーブするディレクトリに、分散設定ファイルとして置いておくこともできる (ファイル名は AccessFileName ディレクティブで指定 - 通常は .htaccess ) 。

設定ファイルの基本文法

作った設定ファイルの文法をチェックするには:
apachectl -t または apachectl configtest

設定ディレクティブ一覧

設定全体の構成は、大別すると 3 つのセクションに分かれる。ひとつ目がサーバ全般の環境設定 (下記のリストで Global Environment のセクション)、ひとつ飛んで 3 番目がバーチャルホスト設定 (Virtual Hosts)。2 番目にくるのは、デフォルトとなるホストの設定セクション (Hosts Default) で、これは、バーチャルホストを設定していない場合や、どのバーチャルホストにも当てはまらない要求が来た時の動作を規定したり、各バーチャルホストのデフォルト値として働く。ディレクティブには、サーバ全般の設定でしか使えないものや、バーチャルホスト設定内でしか使えないもの、<Director></Directory> ブロックの中でしか使えないもの、分散設定ファイルでもどこでも使えるものなど、使える場所が決まっている。そうした 「使える場所」 に基づいて、主なディレクティブを httpd.conf 風にリストアップしたのが以下の一覧だ。ハイパーリンクの張ってあるディレクティブは、次ページの 「つまずきやすい設定項目」 へのリンクになっている。

その他の全ディレクティブについて使用可能領域を知るには、Apache 2.0 doc の ディレクティブ クイックリファレンス が役に立つ。

Global Environment セクション

httpd の動作環境全般に関する設定群。言い換えれば、これらのディレクティブはバーチャルホストセクションや <Directory></Directory> ブロック内では決して使えない 。なお、MIME タイプにまつわるディレクティブは、ほかのセクションでも出てくるので 「その 1」 とした。 User, Group ディレクティブは、 Apache 1.3 ではバーチャルホスト設定セクションでも使用できたが、 2.0 では Global な設定にしか使えなくなった。

User, Group, ServerRoot, PidFile, TimeOut, StartServers, MinSpareServers, MaxSpareServers, MaxClients, MaxRequestsPerChild, Listen, ServerTokens, ExtendedStatus, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine, LoadModule, (Include)
## MIME-Type setting 1 ##
TypesConfig

Hosts Default セクション

そもそもバーチャルホストが設定されていない場合や、どの IPベース バーチャルホスト にも当てはまらない要求を受けた際に適用される動作設定。また、IPベース/ネームベースにかかわりなく、すべてのバーチャルホストのデフォルト値としても働く。ここで使えるディレクティブのほとんどは、バーチャルホストセクションでも使用できる。アスタリスク付き茶色文字 で示したディレクティブは、 Apache 付属のサンプル設定ファイルでもそうであるように、対象ディレクトリを規定しての使用はあまりされないようだが、 ディレクトリ毎の個別設定も可能であることを示すために、ここではルートディレクトリの定義ブロック (<Directory />) 内に配置した。

ServerName, ServerAdmin, KeepAlive, MaxKeepAliveRequests, KeepAliveTimeout
## Log setting ##
ErrorLog, LogLevel, LogFormat, CustomLog
#===============================
# Content Serving setting
#===============================
DocumentRoot, AccessFileName
## MIME-Type setting 2 ##
MIMEMagicFile
## Other modules setting ##
DAVLockDB, Scriptsock
## Directory and Alias setting ##
<Directory />
*ServerSignature, *UseCanonicalName, *HostNameLookups, *EnableMMAP, *EnableSendfile, *DirectoryIndex, *LimitRequestBody
## MIME-Type setting 3 ##
*DefaultType, *AddEncoding, *AddType, *AddHandler, *AddOutputFilter, *AddOutputFilterByName, Action
## Index view setting ##
IndexOptions, IndexIgnore, *ReadmeName, *HeaderName, *AddIconByEncoding, *AddIcon, *DefaultIcon, *AddDescription
## Language and Content-negotiation ##
*AddDefaultCharset, *DefaultLanguage, *AddLanguage, *LanguagePriority, *ForceLanguagePriority, *AddCharset
### Error responses Customization ###
*ErrorDocument
### User-agent fixiation ###
*BrowserMatch
## Other ##
Redirect, Options, AllowOverride, AuthType, AuthName, <Limit>, <LimitExcept>, Order, Deny/Allow from, ...
</Directory>
<FilesMatch "^\.ht.+">
</FilesMatch>
Alias /icons/ "/var/www/icons/"
<Directory "/var/www/icons">
Options, AllowOverride, Order, Allow from, ...
</Directory>
Alias /error/ "/var/www/error/"
<Directory "/var/www/error">
AllowOverride, Options, AddOutputFilter, AddHandler, SetHandler, Order, Allow from, LanguagePriority, ForceLanguagePriority, ...
</Directory>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
Options, AllowOverride, Order, Deny/Allow from, ...
</Directory>
UserDir public_html
<DirectoryMatch "^/home/.+/public_html">
Options, AllowOverride, Order, Deny/Allow from, ...
</DirectoryMatch>
...
(Include)
## Server status and info page generator ##
<Location /server-status>
</Location>
<Location /server-info>
</Location>
## Proxy Function setting ##
ProxyRequests
ProxyVia
ProxyPass
ProxyPassReverse
<Proxy *>
</Proxy>
<Proxy balancer://cluster/>
</Proxy>
RequestHeader
RewriteRule
## Cache setting ##
CacheEnable, CacheDisable, CacheRoot, CacheSize, CacheDefaultExpire, CacheMaxExpire, CacheLastModifiedFactor, CacheGcInterval, CacheNegotiatedDocs

Virtual Hosts セクション

バーチャルホスト設定。 Apache のバーチャルホスト動作には、ネームベースと IP ベースの 2 種類がある。おおざっぱに言えば、ネームベースバーチャルホストの場合は、ひとつの http サーバに幾つかの異なったホスト名 (サーバ名) でアクセスでき、そのホスト名毎に違ったドキュメントルートへクライアントを誘導する。一方、異なった IP 毎に誘導先を変えるのが 「IP ベースのバーチャルホスト」 だ。このページを読んでいる人たちに多いであろう ダイナミック DNS を利用しているような小規模サーバでは、ネームベースが専ら。ただし、両方を絡み合わせて使うこともできる。

設定の書き方上の違いは、NameVirtualHost ディレクティブによる 「リッスンする IP とポート」 の規定 (ワイルドカード * も含む) があり、その IP, ポートにマッチする <VirtualHost> セクションがあれば、その <VirtualHost> ブロックはネームベースのバーチャルホストとして働く。 NameVirtualHost ディレクティブが無いか、 NameVirtualHost で指定した IP & ポートにマッチしない <VirtualHost> セクションは IP ベースバーチャルホストとして動作する。なお、どちらの場合でも、 <VirtualHost ip:port> で指定したいアドレスとポートは全て、 Global Environment セクションListen ディレクティブでカバーされていなければならない。

重要なポイント:

最も注意すべきは、ネームベースと IP ベースでは、Virtual Hosts セクションと Hosts Default セクションとの関係が違ってくるという点だ。

ネームベースバーチャルホストだけが設定されている場合には、Hosts Default セクションの設定は各バーチャルホストのデフォルト値としてのみ働き、Hosts Default セクションが 1 個のホスト定義として直接使われることは決して無い。 HTTP リクエストの要求してきたサーバ名がどの <VirtualHost> ブロック内の ServerName にもマッチしなかった時には、最初に書いてある <VirtualHost> ブロックの定義が使われる。

これに対して IP ベースの場合、どの <VirtualHost> にも当てはまらない IP およびポート宛の要求が来た際には、Hosts Default セクションの設定が 1 個のデフォルトホスト定義として使われる。この分野の説明は Apache バーチャルホスト説明書 (Apache Doc) に詳しい。

NameVirtualHost ip:port
## Default Virtual Host ##
<VirtualHost ip:port>
DocumentRoot, ServerName, (ServerAdmin, <Directory>, <Files>, Include, ...)
</VirtualHost>
## Virtual Host 0 ##
<VirtualHost ip:port>
DocumentRoot, ServerName, (ServerAdmin, <Directory>, <Files>, Include, ...)
</VirtualHost>
## Virtual Host n ##
...

Apache の挙動をテストするためのツール

Apache の設定を煮詰めるに当たって、サーバの送ってくる HTTP ヘッダ (HTMLヘッダではない) が見たくなることが多い。そこで一番手っ取り早いのが telnet によるレスポンステストだ。中でも、Linux の備えている telnet は使いやすいので、WEB サーバ自体のコンソールからループバックアドレスに対して telnet してみるのがお勧め。セッションの例を以下に示そう:

user# telnet 127.0.0.1 80 |tee testlog.txt
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET /somedir/some.html HTTP/1.1<ENTER>
User-Agent: Telnet<ENTER>
Host: 127.0.0.1<ENTER>
<ENTER>

これで HTTP ヘッダと HTML コンテンツがドバッとコンソールに出力されるはず。コンテンツが長くてコンソールのバッファを超えてしまう場合には、緑字のように tee コマンドにパイプ渡ししてやれば、コンソールにも出力しつつ、上記ならカレントディレクトリの testlog.txt にもログが出力される。

Windows 2000 以降に装備されている telnet の場合は、以下のようにしてローカルエコーをオンにしないとリクエストが打ちづらい:

C:\WINDOWS> telnet
Microsoft (R) Windows....
Escape character is 'CTRL+]'.
Microsoft Telnet> set LOCAL_ECHO
Microsoft Telnet> open 192.168.0.1 80
GET /somedir/some.html HTTP/1.1<ENTER>
User-Agent: Telnet<ENTER>
Host: 192.168.0.1<ENTER>
<ENTER>

そして Unix 系でもうひとつの便利なツールが Lynx, Links, Elinks といったテキストベースのブラウザだ。様々な起動オプションを備え、WEB サーバの解析にはうってつけ。認証の必要なページに対するテストも簡単にできる。Lynx で上記と同じことをやるなら、たったこれだけのコマンドでいける:

user# lynx -mime_header http://127.0.0.1/ |tee testlog.txt