当記事では、Apache HTTP Serverの最小設定を追求してみた試みの結果をまとめています。調査に用いたのは2020年8月7日にリリースされたv2.4.46です。実行環境はWindows 10 Home 64bit版です。
※2020/12/28: ServerNameディレクティブの指定と、dir_moduleモジュールの読み込みが不要であることに気づいたので、全面的に記事内容を修正しました。
1. 最小構成
私が動作することを確認した――localhost:80/index.html、あるいは127.0.0.1:80/index.htmlから自作したWebページが表示されることを確認した最小構成の設定は以下の通りです。
Listen 80
LoadModule authz_core_module modules/mod_authz_core.so
初期設定と比べると「これで本当に動くのか……?」と不安になるほど簡素ですが、これでも動きます。
ところで、この設定にしたところ、いくつか面白い挙動を発見したので以下に記載します。
2. サーバー起動時に警告が出る問題
この設定でサーバーを立ち上げると以下のような警告が表示されます。
PS C:\Apache24> .\bin\httpd.exe
AH00558: httpd.exe: Could not reliably determine the server's fully qualified domain name, using fe80::c98a:d261:60b2:36a7. Set the 'ServerName' directive globally to suppress this message
Google翻訳にかけたところ「ドメイン名が指定されていないようだけれど大丈夫?」というようなことを言っているようですが、動作には影響ありません。
3. ServerRoot問題
Apache HTTP Serverの設定項目の1つに、ServerRootディレクティブというものがあります。これは、どこのディレクトリにApache HTTP Serverが格納されているかを指定するものであり、設定ファイル内で相対パスを用いた時のルートパスにもなります。
冒頭設定のようにServerRootディレクティブを省略していると自動的にパスが指定されるようです。具体的には、Apache HTTP Serverのエントリポイントとなるhttpd.exeが配置されているドライブの直下にあるApache24というディレクトリがルートパスに指定されるようです。つまり、httpd.exeをCドライブに配置したならば、C:/Apache24がルートパスとなります。
ところで、httpd.exeが配置されたドライブが指定されるという仕様は分からなくもないですが、Apache24というディレクトリ名がどこから来たのか謎ですよね。
これは推測なのですが、Apache HTTP Server v2.4.46をダウンロードしたときの初期ディレクトリ名がApache24だったので、そこと関係しているのではないかと考えています。ですので、将来v2.5.xが出てきたら、初期ディレクトリ名はApache25になるでしょうから、そのときはルートディレクトリもApache25が使われるようになるのかもしれませんね。
4. DocumentRoot問題
外部に公開するWebコンテンツが格納されたディレクトリのルートパスを指定するDocumentRootディレクティブを省略した場合、ServerRoot直下のhtdocsというディレクトリがDocumentRootに指定されるようです。
5. DirectoryIndex問題
DirectoryIndexディレクティブが省略されている場合の挙動はちょっとややこしいです。
まず、DirectoryIndexディレクティブはApache HTTP Serverに組み込まれているディレクティブではありません。標準で同梱されているmod_dirというモジュール(Apache24/modules/mod_dir.so)内で定義されたディレクティブです。
mod_dirを読み込んでいない場合、DirectoryIndexディレクティブは機能しませんので特定のファイル(慣例的には、ドキュメントルート直下のindex.html)がリダイレクトされることはありません
ただし、同モジュールを読み込んでいるがDirectoryIndexディレクティブを指定していなかった場合は、ドキュメントルート直下のindex.htmlが自動的に返されるようになります。
冒頭に記載したhttpd.confではmod_dirを読み込んでいませんので、DirectoryIndexディレクティブは使えませんし、自動的に特定のファイル名が返されることもありません。
6. authz_core_moduleとは
冒頭の設定ファイルには、LisenディレクティブとLoadModuleディレクティブが1つずつ指定されています。Listenディレクティブは、v2.0.0から、指定されていないとエラーを吐くようになったので指定せざるをえないとして、LoadModuleディレクティブで読み込んでいるauthz_core_moduleとは何なのでしょうか。
結論から言うと、このモジュールはWebコンテンツへアクセスを許可したり拒否したりするための認証機能とやらを提供するようです。詳しいことは分かりませんし、完全に推測になってしまいますが、どうも、このモジュールを読み込んでいないとWebサーバー内のファイルにアクセスしても無条件に弾かれてしまうようです。