コンテンツにスキップ

VirtualHostと設定セクション

Apache は VirtualHost でサイトを選び、Directory や Location などの設定セクションで対象リソースへの処理を決める。


<VirtualHost> は、特定の IP アドレスとポートで受けるサイト設定をまとめる。

/etc/apache2/sites-available/www.example.com.conf
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/html
</VirtualHost>

*:80 の * は、Apache が待ち受けているすべてのローカルアドレスを対象にする指定である。80 は HTTP の待ち受けポートである。

VirtualHost を書くだけでは、OS がそのポートで待ち受けるとは限らない。待ち受けポートは Listen で決まり、Debian では主に /etc/apache2/ports.conf で設定される。


ServerName は、その VirtualHost が受け持つ主なホスト名を指定する。

ServerName www.example.com

Apache は、まず接続先の IP アドレスとポートが一致する VirtualHost を候補にする。候補が複数ある場合は、HTTP の Host ヘッダーと ServerName または ServerAlias を比較する。

ServerName www.example.com
ServerAlias example.com

一致する名前がない場合は、その IP アドレスとポートに対して最初に定義された VirtualHost が使用される。apache2ctl -Sは、名前ベースVirtualHostの対応関係と、各IPアドレス・ポートで既定になるVirtualHostを表示する。


DocumentRoot は、URLを通常の静的ファイルへ対応付けるときの起点となるディレクトリである。

DocumentRoot /var/www/html

この設定では、https://www.example.com/index.html は通常 /var/www/html/index.html に対応する。

DocumentRoot は URL とファイルパスの対応を決めるが、そのディレクトリへのアクセスを自動的に許可する設定ではない。ファイルシステム上のアクセス条件は <Directory> で指定する。


<Directory> は、ファイルシステム上のディレクトリに対して設定を適用する。

<Directory /var/www/html>
AllowOverride None
Require all granted
</Directory>

Require all granted は、すべてのクライアントにアクセスを許可する認可設定である。これを Require valid-user にすると、認証に成功したユーザーだけを許可する。

AllowOverride None は、そのディレクトリ配下の .htaccess による設定上書きを無効にする。VirtualHost の設定ファイルを管理できる構成では、設定箇所を一元化し、リクエストごとの .htaccess 探索を避けられる。


<Location> は、ファイルシステム上の場所ではなく URL パスに対して設定を適用する。

<Location /status>
Require local
</Location>

/status が実ファイルであるとは限らない。モジュールが生成するURL、リバースプロキシ先、アプリケーションの仮想的なURLなど、ファイルパスで表せない対象に使える。

静的ファイル /var/www/html/private を保護する場合は、実体のあるディレクトリを対象にできる <Directory /var/www/html/private> が分かりやすい。


request URL: /private/index.html
|
+-> URL namespace: <Location /private>
|
+-> filesystem mapping: /var/www/html/private/index.html
-> <Directory /var/www/html/private>

Directory と Location は同じ文字列を対象にしているように見えても、評価する名前空間が違う。同じリクエストが複数の設定セクションに一致する場合、各モジュールの規則に従って設定が統合される。

設定ファイルに書かれた単純な上下関係だけで最終結果を判断せず、対象がURLなのかファイルパスなのかを先に確認する。


通常の<Directory>セクションは、パスの短いものから長いものへ処理される。/var/www/html/privateへのリクエストでは、<Directory /var/www/html>の後に<Directory /var/www/html/private>が処理される。

<Directory /var/www/html>
Require all granted
</Directory>
<Directory /var/www/html/private>
Require valid-user
</Directory>

設定セクションが一致するたびに、各モジュールが自分の設定を統合する。すべてのディレクティブが単純に追記されるわけではない。

認可設定では、AuthMergingの既定値はOffである。後から処理されるセクションに別のRequireがあれば、それより前の認可条件を置き換える。この例では、private配下の認可条件はRequire all grantedではなくRequire valid-userになる。前の認可条件と明示的に結合するときは、AuthMerging AndまたはAuthMerging Orを使う。

VirtualHost内の設定セクションは、メインサーバーにある同種のセクションより後に処理される。複数のVirtualHost設定が一つのリクエストへ統合されることはなく、選択された一つのVirtualHostだけが使われる。


Require は、そのリクエストを許可する条件を指定する。

Require all granted

すべてのクライアントを許可する。

Require local

ローカルホストからのアクセスを許可する。

Require valid-user

設定された認証プロバイダーで認証に成功したユーザーを許可する。

認証はユーザーが誰かを確認する処理であり、Require は確認されたユーザーや接続元を許可するか判断する処理である。


VirtualHost ごとにエラーログとアクセスログを分けると、どのサイトの処理かを判別しやすい。

ErrorLog ${APACHE_LOG_DIR}/www.example.com-error.log
CustomLog ${APACHE_LOG_DIR}/www.example.com-access.log combined

${APACHE_LOG_DIR} は Debian の Apache 起動環境で定義され、通常は /var/log/apache2 を指す。combined はアクセス元、リクエスト、ステータス、User-Agentなどを含む定義済みのログ形式である。