Product SiteDocumentation Site

11.2. ウェブサーバ (HTTP)

Falcot Corp の管理者は Debian Jessie に含まれるバージョン 2.4.10 の Apache HTTP サーバを使うことに決めました。

11.2.1. Apache のインストール

apache2 パッケージをインストールするだけで、Apache に必要な物はすべてインストールされます。パッケージには Multi-Processing Modules (MPMs) も含まれており、MPM は Apache が多くの要求の並列処理を取り扱う方法に影響をおよぼします (以前の MPM はそれぞれ対応する apache2-mpm-* パッケージから提供されていました)。apache2 パッケージは apache2-utils パッケージに依存しており、apache2-utils パッケージには後に使うコマンドラインユーティリティが含まれます。
MPM は Apache が同時要求を処理する方法に大きな影響をおよぼします。worker MPM を選んだ場合、スレッド (軽量プロセス) で同時要求を処理します。これに対して prefork MPM を選んだ場合、あらかじめ生成したプロセスプールで同時要求を処理します。event MPM を選んだ場合、スレッドで同時要求を処理しますが、非アクティブ接続 (特に HTTP keep-alive 機能を使ってオープン状態を維持された接続) に対しては専用の管理スレッドで処理します。
Falcot の管理者はさらに Apache の PHP サポートを有効化するために libapache2-mod-php5 をインストールしています。libapache2-mod-php5 をインストールすると、デフォルトの event MPM は無効化され、代わりに prefork MPM を使うようになります。なぜなら、PHP は prefork MPM の下でしか動かないからです。
Apache はモジュール式サーバで、多くの機能が外部モジュールによって実装されており、主プログラムは初期化の際に外部モジュールを読み込みます。デフォルト設定では、最も一般的なモジュールだけが有効化されていますが、新しいモジュールの有効化は a2enmod module を実行するだけで簡単に行うことが可能です。これに対して、モジュールを無効化するコマンドは a2dismod module です。実際のところ、これらのプログラムは /etc/apache2/mods-enabled/ 内に実際のファイル (/etc/apache2/mods-available/ 内に保存されています) を指すシンボリックリンクを作成 (または削除) しているだけです。
Apache のデフォルト設定では、ウェブサーバはポート 80 番をリッスンし (/etc/apache2/ports.conf の中で設定されています)、/var/www/html/ ディレクトリに含まれるページを公開します (/etc/apache2/sites-enabled/000-default.conf の中で設定されています)。

11.2.2. 仮想ホストの設定

仮想ホスト機能を使うことで、単独のウェブサーバで複数のサイトを運用することが可能です。
Apache は異なる 2 種類の仮想ホストを取り扱うことが可能です。具体的に言えば、IP アドレス (またはポート番号) とウェブサーバのドメイン名に基づいて仮想ホスト機能が実装されています。IP アドレスに基づく仮想ホスト機能を使う場合、各サイトに異なる IP アドレス (またはポート番号) を割り当てることが必要です。これに対して、ドメイン名に基づく仮想ホスト機能を使う場合、単一の IP アドレス (またはポート番号) で複数のサイトを運用することが可能で、HTTP クライアントの送信するホスト名によってサイトを識別します (こちらの方法は HTTP プロトコルのバージョン 1.1 で動作します。幸いなことに、HTTP バージョン 1.1 はすべてのクライアントが対応していると考えて良い程度に古いプロトコルです)。
IPv4 アドレスの枯渇は (ますます) 進んでいるため、通常は単一の IP アドレスで複数のサイトを運用する方法が好まれます。しかしながら仮想ホストで HTTPS を提供する必要がある場合、ドメイン名に基づく仮想ホスト機能を使うには複雑な設定が必要になります。なぜなら、SSL プロトコルはドメイン名に基づく仮想ホストを必ず考慮するとは限らないからです。SNI 拡張 (Server Name Indication) を使うことで仮想ホスト上でも SSL プロトコルを使うことが可能になりますが、SNI 拡張はすべてのブラウザで正しく使えるとは限りません。1 つのサーバで複数の HTTPS サイトを運用する必要がある場合、HTTPS サイトは通常異なるポートを使うか異なる IP アドレスを使う (IPv6 が役立ちます) ことで識別されます。
Apache 2 のデフォルト設定では、ドメイン名に基づく仮想ホスト機能が有効にされています。加えて、/etc/apache2/sites-enabled/000-default.conf ファイルの中でデフォルトの仮想ホストが定義されています。この仮想ホストはクライアントによって送信された要求に一致するホストが見つからない場合に使われます。
仮想ホストを追加するには、/etc/apache2/sites-available/ にファイルを追加します。falcot.org ドメインで運用されるウェブサイトをセットアップするには、以下のファイルを作成し、a2ensite www.falcot.org を使って仮想ホストを有効化するだけで簡単に可能です。

例 11.16 /etc/apache2/sites-available/www.falcot.org.conf ファイル

<VirtualHost *:80>
ServerName www.falcot.org
ServerAlias falcot.org
DocumentRoot /srv/www/www.falcot.org
</VirtualHost>
ここまでの設定に従うと、Apache サーバはすべての仮想ホストに対して同じログファイルを使います (仮想ホストの定義に CustomLog 指示文を追加すればこの挙動を変えることが可能です)。そのため、ログファイルのフォーマットをカスタマイズして、仮想ホストの名前を含むようにすることが道理に適っています。これを行うには、/etc/apache2/conf-available/customlog.conf ファイルを作成してすべてのログファイルに対する新しいフォーマットを定義し (LogFormat 指示文を使います)、さらに a2enconf customlog を有効化します。また、/etc/apache2/sites-available/000-default.conf ファイルから CustomLog 指示文を削除 (またはコメントアウト) しなければいけません。

例 11.17 /etc/apache2/conf.d/customlog.conf ファイル

# (仮想) ホスト名を含む新しいログフォーマット
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost

# 上で定義した "vhost" フォーマットを使用します
CustomLog /var/log/apache2/access.log vhost

11.2.3. よく使われる指示文

この節では、いくつかのよく使われる Apache 設定指示文を簡単に見直します。
主要設定ファイルにはいくつかの Directory ブロックが含まれます。Directory ブロックを使うことで、提供されるファイルの位置に従って、サーバの挙動を変えることが可能です。Directory ブロックには通常 OptionsAllowOverride 指示文が含まれます。

例 11.18 Directory ブロック

<Directory /var/www>
Options Includes FollowSymlinks
AllowOverride All
DirectoryIndex index.php index.html index.htm
</Directory>
DirectoryIndex 指示文には、クライアントからディレクトリを要求された場合に応答として送信するファイルのリストを指定します。リスト内の最初に見つかったファイルが応答として使われます。
Options 指示文には、有効化するオプションを指定します。None を指定するとすべてのオプションが無効化されます。それに対して All を指定すると MultiViews を除いたすべてのオプションが有効化されます。以下に利用できるオプションを挙げます。
  • ExecCGI。サーバは CGI スクリプトの実行を許可されます。
  • FollowSymlinks。サーバはシンボリックリンクをたどってリンク先の内容を応答として返すことを許可されます。
  • SymlinksIfOwnerMatch。サーバはシンボリックリンクとリンク先が同じ所有者の場合に限りシンボリックリンクをたどることを許可されます。
  • Includes。サーバは Server Side Includes (略して SSI) を使うことを許可されます。SSI とは HTML ページの中に埋め込まれた要求ごとにその場で処理される指示です。
  • Indexes。サーバはクライアントの送信した HTTP 要求が index ファイルの含まれないディレクトリを指している場合 (たとえば DirectoryIndex 指示文でリストされているファイルがこのディレクトリ内に存在しない場合) にディレクトリの内容をリストすることを許可されます。
  • MultiViews。サーバはコンテンツネゴシエーションを使うことを許可されます。コンテンツネゴシエーションを使うことで、サーバはブラウザで設定した優先言語に一致するウェブページを返します。
AllowOverride 指示文には、.htaccess ファイルを使って有効化または無効化することを許可するすべてのオプションをリストします。AllowOverride 指示文は一般に ExecCGI を制限するために使われることが多いです。こうすることで、管理者はウェブサーバ (www-data ユーザ) の権限でプログラムを実行することを許可するユーザを選択します。

11.2.3.1. 認証要求

ウェブサイトのある部分へのアクセスを制限し、ユーザ名とパスワードに基づく正当なユーザだけが内容にアクセスできるように設定する必要があるかもしれません。

例 11.19 認証要求を行う .htaccess ファイル

Require valid-user
AuthName "Private directory"
AuthType Basic
AuthUserFile /etc/apache2/authfiles/htpasswd-private
/etc/apache2/authfiles/htpasswd-private ファイルには、ユーザとパスワードのリストが含まれます。このファイルを操作するには通常 htpasswd コマンドを使います。たとえば、以下のコマンドを使うことで、ユーザを追加するかユーザのパスワードを変更します。
# htpasswd /etc/apache2/authfiles/htpasswd-private user
New password:
Re-type new password:
Adding password for user user

11.2.3.2. アクセス制限

Require 指示文を使うことで、あるディレクトリへのアクセスを制御 (とサブディレクトリへのアクセスを再帰的に制御) します。
Require 指示文は多くの基準を基にアクセスを制限するために使われます。ここではクライアントの IP アドレスに基づいてアクセス制限の基準を定義するのではなく、特にいくつかの Require 指示文を RequireAll ブロックと組み合わせることでより強力なアクセス制限の基準を表現します。

例 11.20 ローカルネットワークからのアクセスだけを許可する例

Require ip 192.168.0.0/16

11.2.4. ログ解析ソフトウェア

ウェブサーバには、通常ログ解析ソフトウェアがインストールされます。なぜなら、ログ解析ソフトウェアを使うことで管理者はウェブサーバの使用形態に関する正確な知見を得ることが可能だからです。
Falcot Corp の管理者は AWStats (Advanced Web Statistics) を使って Apache ログファイルを解析することに決めました。
最初に /etc/awstats/awstats.conf ファイルをカスタマイズして設定を行います。Falcot の管理者は以下のパラメータだけを修正し、他はそのままの状態にしています。
LogFile="/var/log/apache2/access.log"
LogFormat = "%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
SiteDomain="www.falcot.com"
HostAliases="falcot.com REGEX[^.*\.falcot\.com$]"
DNSLookup=1
LoadPlugin="tooltips"
これらのパラメータに関する説明はテンプレートファイルにコメントとして書かれています。特に、LogFileLogFormat パラメータを使って、ログファイルの場所とログファイルに含まれる情報の書式を指定します。さらに SiteDomainHostAliases は主要ウェブサイトに割り当てている複数の名前をリストします。
トラフックの多いサイトでは通常 DNSLookup1 に設定するべきではありません。トラフィックの少ないサイトでは Falcot の設定と同様に DNSLookup を設定することで、解析結果に生 IP アドレスではなく完全なマシン名が含まれるようになり、解析結果を読みやすくなります。
他の仮想ホストに対して AWStats を有効化することも可能です。その場合、各仮想ホストに対して /etc/awstats/awstats.www.falcot.org.conf などの設定ファイルを作ってください。

例 11.21 仮想ホスト用の AWStats 設定ファイル

Include "/etc/awstats/awstats.conf"
SiteDomain="www.falcot.org"
HostAliases="falcot.org"
AWStats は /usr/share/awstats/icon/ ディレクトリに保存されている多くのアイコンを使います。ウェブサイトでこれらのアイコンを使えるようにするためには、以下の指示文を Apache の設定に追加する必要があります。
Alias /awstats-icon/ /usr/share/awstats/icon/
数分後 (スクリプトを複数回実行した後)、結果をオンラインで見ることが可能になります。