VirtualHostと設定セクション
Apache は VirtualHost でサイトを選び、Directory や Location などの設定セクションで対象リソースへの処理を決める。
VirtualHost
Section titled “VirtualHost”<VirtualHost> は、特定の IP アドレスとポートで受けるサイト設定をまとめる。
<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の選択
Section titled “ServerNameとVirtualHostの選択”ServerName は、その VirtualHost が受け持つ主なホスト名を指定する。
ServerName www.example.comApache は、まず接続先の IP アドレスとポートが一致する VirtualHost を候補にする。候補が複数ある場合は、HTTP の Host ヘッダーと ServerName または ServerAlias を比較する。
ServerName www.example.comServerAlias example.com一致する名前がない場合は、その IP アドレスとポートに対して最初に定義された VirtualHost が使用される。apache2ctl -Sは、名前ベースVirtualHostの対応関係と、各IPアドレス・ポートで既定になるVirtualHostを表示する。
DocumentRoot
Section titled “DocumentRoot”DocumentRoot は、URLを通常の静的ファイルへ対応付けるときの起点となるディレクトリである。
DocumentRoot /var/www/htmlこの設定では、https://www.example.com/index.html は通常 /var/www/html/index.html に対応する。
DocumentRoot は URL とファイルパスの対応を決めるが、そのディレクトリへのアクセスを自動的に許可する設定ではない。ファイルシステム上のアクセス条件は <Directory> で指定する。
Directory
Section titled “Directory”<Directory> は、ファイルシステム上のディレクトリに対して設定を適用する。
<Directory /var/www/html> AllowOverride None Require all granted</Directory>Require all granted は、すべてのクライアントにアクセスを許可する認可設定である。これを Require valid-user にすると、認証に成功したユーザーだけを許可する。
AllowOverride None は、そのディレクトリ配下の .htaccess による設定上書きを無効にする。VirtualHost の設定ファイルを管理できる構成では、設定箇所を一元化し、リクエストごとの .htaccess 探索を避けられる。
Location
Section titled “Location”<Location> は、ファイルシステム上の場所ではなく URL パスに対して設定を適用する。
<Location /status> Require local</Location>/status が実ファイルであるとは限らない。モジュールが生成するURL、リバースプロキシ先、アプリケーションの仮想的なURLなど、ファイルパスで表せない対象に使える。
静的ファイル /var/www/html/private を保護する場合は、実体のあるディレクトリを対象にできる <Directory /var/www/html/private> が分かりやすい。
DirectoryとLocationの違い
Section titled “DirectoryとLocationの違い”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なのかファイルパスなのかを先に確認する。
設定セクションの統合順序
Section titled “設定セクションの統合順序”通常の<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
Section titled “認可を表すRequire”Require は、そのリクエストを許可する条件を指定する。
Require all grantedすべてのクライアントを許可する。
Require localローカルホストからのアクセスを許可する。
Require valid-user設定された認証プロバイダーで認証に成功したユーザーを許可する。
認証はユーザーが誰かを確認する処理であり、Require は確認されたユーザーや接続元を許可するか判断する処理である。
VirtualHost ごとにエラーログとアクセスログを分けると、どのサイトの処理かを判別しやすい。
ErrorLog ${APACHE_LOG_DIR}/www.example.com-error.logCustomLog ${APACHE_LOG_DIR}/www.example.com-access.log combined${APACHE_LOG_DIR} は Debian の Apache 起動環境で定義され、通常は /var/log/apache2 を指す。combined はアクセス元、リクエスト、ステータス、User-Agentなどを含む定義済みのログ形式である。
-
VirtualHost Examples 名前ベースVirtualHostの構成例。
-
Configuration Sections
Directory、Location、Files、VirtualHostの適用対象と統合。 -
mod_authz_core
RequireとAuthMergingによる認可条件の統合。 -
Apache Core Features
DocumentRoot、Directory、AllowOverride、ServerNameなどのコアディレクティブ。