Apache HTTP Server

Apache HTTP Server はオープンソースのWebサーバです。

Apacheのインストール

Windows版のApacheをインストールする手順を次に示す。

http://httpd.apache.org/download.cgiからApache HTTP Serverをダウンロードする。ここでは、「Win32 Binary without crypto (no mod_ssl) (MSI Installer)」をダウンロードする。

ダウンロードした「httpd-2.0.64-win32-x86-no_ssl.msi」を実行する。

Installation Wizard
Figure 1. Installation Wizard

「License Agreement」画面では「I accept the license agreement」を選択する。

License Agreement
Figure 2. License Agreement
Read This First
Figure 3. Read This First

「Server Information」画面ではネットワークドメイン、サーバ名及びメールアドレスを入力する。ローカルで動作させる場合、ネットワークドメインとサーバ名には「localhost」と入力する。

Server Information
Figure 4. Server Information
Setup Type
Figure 5. Setup Type
Destination Folder
Figure 6. Destination Folder
Installing
Figure 7. Installing
Instllation Wizard Completed
Figure 8. Instllation Wizard Completed

インストーラが終了すると、自動的にApacheが起動される。

ブラウザから「http://localhost/」を開いて、サンプルページが表示されることを確認する。

It works!
Figure 9. It works!

Apacheを起動する

Solaris版 Apache の起動は以下の手順で行います。

  1. /etc/apache/httpd.conf の編集
  2. /usr/apache/bin/apachectl start を実行
#
# Aliases: Add here as many aliases as you need (with no limit). The format is
# Alias fakename realname
#
<IfModule mod_alias.c>

  Alias /mydoc/ "/home/user/mydoc/"

  <Directory "/home/user/mydoc">
      AllowOverride None
  </Directory>

</IfModule>
# End of aliases.

編集内容についてはhttpd.confを参照。

WindowsでApacheを起動するには、Apacheをサービスとして起動する方法と、Apacheをコンソールアプリケーションとして起動する方法の2通りの方法がある。

WindowsでApacheをコンソールアプリケーションとして起動するには、次の手順で行う。

  1. binフォルダにあるhttpd.exeを実行する。
    C:\Apache24\bin> httpd.exe
  2. 「Windowsセキュリティの重要な警告」が表示された場合、アクセスを許可する。(管理者権限が必要)

Apacheを停止する

Windowsでサービスとして起動したApacheを停止させるには、次の手順で行う。

  1. binフォルダにあるhttpd.exeに-k shutdownオプションを指定して実行する。
    C:\Apache24\bin> httpd.exe -k shutdown

Windowsでコンソールアプリケーションとして起動したApacheを停止させるには、次の手順で行う。

  1. Apacheをコンソールアプリケーションとして起動したCUI(コマンドプロンプトなど)で「Ctrl+C」を押す。

ドキュメントルートにWebコンテンツを配置する

ドキュメントルートとは、Webコンテンツを配置するディレクトリのことである。ドキュメントルートは、confディレクトリにあるhttpd.confファイルで設定する。

Apache HTTPサーバモジュール

Apache HTTPサーバの核となる機能は、coreモジュールとして提供されている。Apache HTTPサーバはモジュールを追加することで機能を拡張できる。

Apache HTTPサーバのモジュール
モジュール 説明
core Apache HTTPサーバの基本的な機能
mod_access_compat ホストに基づいたグループ承認
mod_include サーバ側インクルード(SSI: Server Side Include)を可能にするモジュール
mod_rewrite 要求されたURLを書き換えるルールベースの書き換えエンジンを提供する。

.htaccessの設定

.htaccessファイルによる制御を有効にするかどうかは、confディレクトリにあるhttpd.confファイルで設定する。httpd.confでAllowOverrideディレクティブがNoneに設定されている場合は、.htaccessによる制御が無効となる。Apacheの初期設定では、AllowOverrideはNoneに設定されている。

<Directory "c:\Apache24\htdocs">
AllowOverride None
</Directory>

.htaccessによる制御を有効にする場合、AllowOverrideをAllに変更する。

<Directory "c:\Apache24\htdocs">
AllowOverride All
</Directory>

画像ファイルの直リンクを防ぐアクセス制御設定を次に示す。

<Files ~ "\.(gif|jpg|png)$">
SetEnvIf Referer "^http://itref\.fc2web\.com" foo
SetEnvIf Referer "^$" foo
order deny, allow
deny from all
allow from env=foo
</Files>

httpをhttpsへリダイレクトする

httpをhttpsへリダイレクトするには、.htaccessに次の記述を追加する。

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

wwwありをwwwなしへリダイレクトする

wwwありをwwwなしへリダイレクトするには、.htaccessに次の記述を追加する。

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.segakuin\.com
RewriteRule ^(.*) http://segakuin.com/$1 [R=301,L]

サーバ側インクルード(SSI: Server Side Include)

Apacheモジュールmod_includeを使用することにより、サーバ側インクルード(SSI: Server Side Include)が可能になる。

HTML文書に別の文書を挿入するには、HTML文書に次の構文でコメントを埋め込む。

<!--#include virtual="url" -->

url にはインクルードする文書のURLを指定する。ただし、URLにスキームやホスト名を含めることはできない。

サーバサイドインクルードのサンプルを示す。

<!--#include virtual="/include/example.html" -->

URLにはCGIを指定することができる。クエリ文字列を含めることもできる。

<!--#include virtual="/cgi-bin/example.cgi?argument=value" -->

Apacheでサーバ側インクルードを有効にするには、httpd.confに次のディレクティブを指定する。

<Directory "c:\Apache24\htdocs">
Options +Includes
</Directory>

<IfModule mime_module>
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModucle>

WEBサーバのチューニング

ファイルシステム

ログ

ネットワークコードのパラメータ

ループバックファイルシステム

lofs (loopback virtual file system) は、架空のファイルシステムを作り、ファイルに別のパス名を与えることができる。 例えば、/ の上に /tmp/newroot をループバックマウントすると、ルート以下の全てのファイルシステムが、/tmp/newroot 以下にコピーされたかのように見える。

Nagle アルゴリズム

TCP/IP Nagle アルゴリズムは、基本的にはバッファリングの方法である。 どんなに小さなパケットであっても、全てのパケットに対して一定のオーバヘッドがある。 このために Nagle アルゴリズムは小さいパケットを(0.2 秒以上の遅延は無い様に)一緒に集めることによって、転送されるバイと数のオーバヘッドを減らしている。

Apacheのチューニング

ログ

Apache にはリクエストされたアクセスがどのようなブラウザから送られてきたのかを、ログに出力するオプション機能がある。この機能により、利用されているブラウザの傾向を知ることができる。エージェントログを有効にするには、AgentLog オプションを設定する。

AgentLog logs/agent_log

Apache には、インターネット上のどのサイトのリンクを辿って自サイトへアクセスしてきたか(リンキング)をログに出力させる機能がある。この機能を有効にするには、RefererLog オプションを設定する。

RefererLog logs/referer_log

エージェントログおよび参照者ログは、必要の無い限り取らない方が望ましい。

HostnameLookups

Apache 1.3では、HostnameLookups の初期設定は off である。 この設定だと、DSNルップアップによる余分な処理が無くなるので、HTMLファイルが表示されるまでの時間が短くなる。 しかし、1.3以降のバージョンでは、allow from domain や deny from domain ディレクティブを使うと、二重リバースNDSルックアップという代償を払うことになる(リバースに加えて、リバースが誤魔化されていないかの確認のためのフォワード)。 ディレクティブの範囲を <Location /server-status> セクションで制限することで、上記の二重リバースDNSルックアップを避けることができる。 例えば、 .html ファイルと .cgi ファイル以外はルックアップしないようにするには、次のようにする。

HostnameLookups off
<Files "\.(html|cgi)$">
  HostnameLookups on
</Files>

幾つかのCGIの中でホスト名が必要であれば、それを必要としている特定のCGIでだけ gethostbyname コールをするように設定する。

<Limit GET> ~ </Limit> に記述することによって外部からのアクセスを制限する。

<Limit GET>
order deny, allow
deny from all
allow from www.foo.co.jp
</Limit>

この記述によって、www.foo.co.jp 以外のホストが <Directory></Directory> タグで指定したディレクトリにアクセスするのを禁止する。

FollowSymLinks and SymLinksIfOwnerMatch

URLスペースに Options FollowSymLinks が無い場合、あるいは Options SymLinksIfOwnerMatch がある場合は、シンボリックリンクをチェックする為に Apache が余分なシステムコールを発する場合がある。各ファイルネーム要素につき、1コールである。例えば、

DocumentRoot /www/htdocs
<Directory />
  Options SymLinksIfOwnerMatch
</Directory>

があって、/index.html というURI (Uniform Resource Identifiers) がリクエストされた場合には、Apache は lstat (2) を /www、/www/htdocs、/www/htdocs/index.html に対して行う。lstat の結果はキャッシュに保存されることはないので、リクエストの度に起こる。

どうしても symlinks セキュリティチェックが必要なら、次の様にする。

DocumentRoot /www/htdocs
<Directory />
  Options FollowSymLinks
</Directory>
<Directory /www/htdocs>
  Options -FollowSymLinks +SymLinksIfOwnerMatch
</Directory>

こうすれば、少なくとも DocumentRoot パスの余分なチェックが不要となる。ドキュメントルート以外に Alias や RewriteRule パスがある場合には、同様のセクションを追加する必要がある。最高の性能を引き出すためにシンボリックリンクのセキュリティチェックをゼロにするためには、全ての箇所に FollowSymLinks を設定して、SymLinksIfOwnerMatch は指定しない。

AllowOverride

URL空間で overrides を認める場合(典型的には .htaccess ファイル)、Apache は各ファイルネーム要素毎に .htaccess を開こうとする。例えば、

DocumentRoot /www/htdocs
<Directory />
  AllowOverride all
</Directory>

があって、/index.html のURIをリクエストをしたとする。 Apache は /.htaccess、/www/.htaccess、そして /www/htdocs/.htaccess を開こうとする。解決策は前述の Options FollowSysLinks と同様である。最高の性能を追求する場合には、ファイルシステムの何処ででも AllowOverride Node を使用すること。

ネゴシエーション

本当に最高の性能を絞り出したい場合には、コンテンツネゴシエーションを極力避けたいところである。しかし、ネゴシエーション機能には性能の低下を補って余りあるものがある。サーバの速度を上げることができる場合がひとつある。

DirectoryIndex index

の様なワイルドカードは使わずに、次の様に全てのオプションを羅列する。

DirectoryIndex index.cgi index.pl index.shtml index.html

ここでは、一番頻繁に使うオプションをリストの頭に記述すること。

プロセスの生成

Apache 1.3以前は、MaxSpareServers、MinSpareServers、そして StartServers の設定はどれもベンチマーク結果に極端に大きな影響を持っている。特に Apache はリクエストによる負荷に見合うだけの数の子プロセスを発生させるのに準備期間が必要だった。StartServers の子プロセスを最初に発生させたら、1秒あたりの子プロセスの発生を1に制限して、MinSpareServers で指定した子プロセス数を保持していた。つまり、100のクライアントが同時にアクセスしているサーバで、StartServers の初期設定が5になっている場合には、このロードに対応できるだけの子プロセスが発生するには95秒程度かかるということになる。

1秒あたり1個発生の法則は、新しい子プロセスの発生でマシンが溢れることを懸念してのものだった。マシンが子プロセス作りで忙しい場合は、リクエストにも対応できないからである。しかし、この法則による制限は Apache の性能が酷く低いものだと解釈されることに繋がってしまったため、変更せざるを得なかった。Apache 1.3からは1秒あたりの規則を緩和したコードが採用されている。子プロセスを1つ発生させ、1秒待ち、2つ発生させ、また1秒待ち、4つ発生させ…という容量で、1秒あたりの子プロセスを32発生させているところまで乗数的に続く。この動作は、MinSpareServers 設定を満たした時点で止まる。

1秒に4つ以上の子プロセスが発生した場合には、メッセージが ErrorLog に出力される。こういうエラーが沢山出てきたら、この設定を変えることを検討する。

プロセス作成に関しては、他に MaxRequestsPerChild 設定による子プロセスの消滅指定もある。この初期設定値は30になっている。しかし、子プロセスに肥大したメモリイメージを持たせるような mod_perl の様なモジュールを使っているサーバでなければ、この値は低すぎる。サーバのページが殆ど静的なものならば、この値を 10,000 あたりまで上げてみる。

keep-alives が使われている場合には、既に開かれている接続での次のリクエストを待って、子プロセスが何もしない状態でいるということになる。KeepAliveTimeOut の12秒という初期設定は、この状態を極力減らすためのものである。ここでは、ネットワークバンド幅とサーバリソースがお互いの足を引き合う形であるが、どんな場合でもこれを60秒以上にしてはならない。それでは殆どの利点が失われてしまうからである。

mod_status and Rule STATUS=yes

Apache をコンパイルするときに mod_status を含めて、さらにRule STATUS を yes に設定した場合には、Apache はリクエストの度に gettimeofday (2) (OSによっては times (2) のこともある)に2回のコールをする。1.3 以前のバージョンでは、さらにいくつか time (2) にコールする。これは、ステータスレポートにタイミング要素を含むようにするためである。よって、最高の性能を追求する場合には、Rule STATUS=no に設定する。

DYNAMIC_MODULE_LIMIT

動的にロードされたモジュールを使わなければ、サーバ構築の際に -D DYNAMIC_MODULE_LIMIT=0 も追加した方が良い。そうすれば動的にロードされたモジュール専用にアロケートされていたRAMも使えるようになる。

関連記事

Apache Tomcat