Product SiteDocumentation Site

11.2. ウェブサーバ (HTTP)

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

11.2.1. Apache のインストール

デフォルトで、apache2 パッケージをインストールすると Apache の apache2-mpm-worker バージョンがインストールされます。apache2 パッケージははメタパッケージであり、Apache バージョンの 1 つがが実際にインストールされている事を確保するためだけに提供されています。
Apache 2 の亜種同士の主な違いは、多くのリクエストを並列処理する際の取り扱い方法に関するポリシーです; このポリシーは MPM (Multi-Processing Module の略) によって実装されています。利用可能な MPM の中でも特に、apache2-mpm-workerスレッド (軽量プロセス) を使います。これに対して apache2-mpm-prefork は予め生成したプロセスプール (古典的方法、Apache 1.3 ではこれしか使えません) を使います。apache2-mpm-event はスレッドを使いますが、入って来る接続が HTTP の keep-alive 機能を使ってオープン状態を保存するためだけのものの場合、スレッドを早く終わらせます。
Falcot の管理者はさらに Apache で PHP サポートを有効化するために libapache2-mod-php5 をインストールします。こうすることで、apache2-mpm-worker が削除され、代わりに apache2-mpm-prefork がインストールされます。なぜなら、 PHP はこの MPM の下でしか動かないからです。
Apache はモジュール式サーバで、多くの機能が外部モジュールによって実装されており、主プログラムは初期化の際に外部モジュールを読み込みます。デフォルト設定では、最も一般的なモジュールだけが有効化されていますが、新しいモジュールの有効化は a2enmod module を実行するだけで簡単に行う事が可能です; モジュールを無効化するコマンドは a2dismod module です。実際のところ、これらのプログラムは /etc/apache2/mods-enabled/ 内に実際のファイル (/etc/apache2/mods-available/ 内に保存されている) を指すシンボリックリンクを作成 (削除) しているだけです。
Apache のデフォルト設定では、ウェブサーバはポート 80 番をリッスンし (/etc/apache2/ports.conf の中で設定されています)、/var/www/ ディレクトリに含まれるページを提供します (/etc/apache2/sites-enabled/000-default の中で設定されています)。

11.2.2. 仮想ホストの設定

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

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

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

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

# New log format including (virtual) host name
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost

# Now let's use this "vhost" format by default
CustomLog /var/log/apache2/access.log vhost

11.2.3. よく使われる指示文

この節では、幾つかのよく使われる Apache 設定指示文を簡単に見直します。
主要設定ファイルには幾つかの 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 値はすべてのオプションを無効化します; 対して AllMultiViews を除いてすべてのオプションを有効化します。利用可能なオプションは以下です:
  • ExecCGI は CGI スクリプトが実行可能な事を意味します。
  • FollowSymlinks を使うことで、シンボリックリンクを辿る事が可能であること、リンク先の内容を応答として返す事をサーバに伝えます。
  • SymlinksIfOwnerMatch を使うことで、シンボリックリンクとリンク先が同じ所有者の場合に限り、シンボリックリンクを辿る事が可能である事をサーバに伝えます。
  • Includes を使うことで、Server Side Includes (略して SSI) が有効化されます。SSI は HTML ページの中に埋め込まれ、各要求毎にその場で実行される指示です。
  • Indexes を使うことで、クライアントの送信した HTTP 要求が index ファイルの含まれないディレクトリを指している場合 (例えば DirectoryIndex 指示文でリストされているファイルがこのディレクトリ内に存在しない場合)、ディレクトリの内容をリストする事をサーバに伝えます。
  • MultiViews を使うことで、コンテンツネゴシエーションが有効化されます; サーバはこれを使って、ブラウザで設定した優先言語に一致するウェブページを返します。
AllowOverride 指示文は .htaccess ファイルを使って有効化または無効化されたすべてのオプションをリストします。このオプションは一般に 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. アクセス制限

Allow fromDeny from 指示文を使うことで、あるディレクトリへのアクセスを制御 (とサブディレクトリへのアクセスを再帰的に制御) します。
Order 指示文を使うことで、Allow fromDeny from 指示文を評価する順番をサーバに伝えます; 最後に一致したものが優先されます。具体的に言えば、Order deny,allow を使うと、Deny from に一致しないホストまたは Allow from に一致するホストからのアクセスを許可します。反対に、Order allow,deny を使うと、Allow from に一致しないホスト (または Deny from に一致するホスト) からのアクセスを拒否します。
Allow fromDeny from 指示文には、IP アドレス、ネットワーク (例えば 192.168.0.0/255.255.255.0192.168.0.0/24192.168.0 など)、ホスト名、ドメイン名、全員を意味する all キーワードを使う事が可能です。

例11.20 デフォルトで拒否して、ローカルネットワークからのアクセスを許可する例

Order deny,allow
Allow from 192.168.0.0/16
Deny from all

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/
数分後 (スクリプトを複数回実行した後)、結果をオンラインで見る事が可能になります: