[APACHE DOCUMENTATION]

Apache HTTP Server

Apache 1.3 の新機能の概要

今回のリリースでの新しい特徴として、Apache の機能性の拡張についてここでは説明します。 コア部分のコードが大きく変わりましたので、初期のバージョンの Apache (および NCSA httpd) が受け付けたものでも、新しい Apache では受けつけないものがあります。なんらかの問題がある場合には 互換性に関して でチェックしてください。

Apache 1.2 からのアップグレードは「アップグレードに関して」を読むと良いでしょう。

拡張: コア | パフォーマンス | 設定 | モジュール | API | その他


コアの拡張:

Dynamic Shared Object (DSO) のサポート
実行時にApache のモジュールをロードすることが可能になりました。 これにより、モジュールは必要なときだけサーバのメモリ領域に 読みこまれることになり、Apache 全体のメモリの使用をかなり減らすことになります。DSO は現在 FreeBSD, OpenBSD, NetBSD, Linux, Solaris, SunOS, Digital UNIX, IRIX, HP/UX, UnixWare, NetWare, AIX, ReliantUnix, 純粋な SVR4 プラットフォームでサポートされています。
Windows NT/95 のサポート
Apache は Windows NT と Windows 2000 をサポートするようになりました。 Windows 95, 98, ME でも Apache は動作するかもしれませんが、 これらのコンシューマ製品の環境での使用は推奨していません。 そして、その使用についての状態は、実験的なものとしたままです。 Windows 上で動作している 1.3.15 より前のすべてのバージョンの Apache は、ベータ版品質のリリースだと考えてください。
Cygwin のサポート
Apache は Windows NT と Windows 2000 上の Cygwin をサポートするようになりました。安定性や信頼性の面から、 Windows 自体と併せて Cygwin のバージョンを考慮すべきです。
NetWare 5.x のサポート
Apache は NetWare 5.x をサポートするようになりました。
ソースの再構成
Apache のソースファイルは再構成されました。Apache のユーザにとって主要な変更点は Configuration における "Module" 行が "AddModule" で置き換わり、 構文が少し変わったことです。モジュールの作者にとっては、 ユーザがモジュールを容易に追加できるようにするための変更が いくつかなされています。
信頼性のあるパイプされたログ
ほとんどすべての Unix アーキテクチャで Apache は「信頼性のある」パイプされたログを mod_log_config で実装しています。 ここで、信頼性のあるとは、ログを収集している子プロセスが 何らかの理由で死んだときに、Apache はサーバ全体を再起動することなく、 そこから回復してログ用プロセスを再起動することができるという意味です。 更に、ログを収集している子プロセスが "詰まって" しまい、 パイプを十分な回数読んでいないときも Apache はそれを再起動します。 これで、ログのローテーションやヒットの選別をしたり、複数の vhost (訳注: バーチャルホスト) のログを別々にリアルタイムで分けたり、 その場での非同期の DNS 解決をしたりする機会ができます。

性能の改善

詳しい情報は性能についての新しいドキュメント を参照してください。


設定の拡張

サーバの設定ファイルの一元化
(Apache 1.3.4) 三つのサーバ設定ファイル (httpd.conf, srm.conf, access.conf) が httpd.conf ファイル一つにまとめられました。srm.confaccess.conf ファイルは、ウェブマスターが httpd.conf を見るようコメントがあるだけで、 後は空になっています。 更に、まとめられた httpd.conf ファイルでは、 ディレクティブ がより直感的で意味のある順番になるように再構成されました。
設定ファイルでの継続した行
設定ファイルにおけるディレクティブの行は Unix の継続行を扱う通常の方法、すなわち '\' をその行の空白以外の最後の文字として置くことで、 次の行をつなぐ形式を用いて、 複数の行に分けることができるようになりました。
Apache Autoconf-style Interface (APACI)
Apache 1.3 になるまでは、 Apache パッケージ全部を展開したらすぐに、ビルドしてインストール するようなバッチ的手順は提供されていませんでした。 しかし、トップディレクトリにある configure スクリプトと、それに対応するトップディレクトリの Makefile.tmpl ファイルで、それが実現されました。 この目的は、GNU の Autoconf 形式のフロントエンドを提供することです。 そして、これまでの src/Configure 関連要素のバッチ処理と、 GNU 流のディレクトリ構成でのパッケージインストールの両方が可能になります。 古い設定方法で可能だったものオプションすべてに加えて、Apache を柔軟にカスタマイズするためのたくさんの新しいオプションが 使用可能です。
注意: デフォルトのインストールの構成は Apache 1.3.4 で変更されました。詳細については README.configureINSTALL ファイルを参照してください。
APache eXtenSion (APXS) サポートツール
Apache は実行時に dynamic shared object (DSO) ファイルから モジュールをロードすることを完全にサポートするようになりました。 そこで、DSO に基づいたモジュールを Apache のソースとは別の場所で ビルド、インストール、アクティブ化を行なう新しいサポートツール apxs が作成されました。これにより、プラットフォーム に依存した DSO ビルド用のコマンドはユーザから完全に隠され、Apache のソースツリーの外でモジュールをビルドすることが容易になっています。 これを達成するために、APACI は Apache の C のヘッダファイルを apxs と一緒にインストールします。
Apache のデフォルトディレクトリパスを /usr/local/apache/ へ変更
Apache のデフォルトの ServerRoot ディレクトリが、NCSA 互換の /usr/local/etc/httpd/から /usr/local/apache/ に変更されました。 これはデフォルトの設定 (とドキュメント) の変更だけです。もちろん、 Apache を起動するときに -d ServerRoot と -f httpd.conf を指定することで変更することができます。
HTTP/1.1 形式のバーチャルホストの改善
NameVirtualHost という新しいディレクティブを使用して IP アドレス:ポート の対を指定することで、HTTP/1.1 形式のバーチャルホストを実現します。 これはクライアントからの Host: ヘッダに基づく バーチャルホストです。以前はこのアドレスは暗黙のうちにマシンの "メインアドレス" と同じにしていましたが、これは数多くの問題を引き起こし、 また機能も十分ではありませんでした。設定の詳細についは 「Apache バーチャルホストドキュメント」 を参照してください。
Include ディレクティブ
設定ファイルのパースの途中で Include ディレクティブに出会うと、 直ちに他の設定ファイルをその場所に挿入します。
バーチャルホストの設定のデバッグのための -S コマンドラインオプション
コマンドラインオプション -S を付けて Apache を起動すると、VirtualHost をどのようにパースしたかという情報を表示します。 これはバーチャルホストの設定をデバッグしようとする場合に便利です。
HTTP メッソドの制御
<LimitExcept> と </LimitExcept> はアクセス制御命令のグループを囲み、 引数として指定していない HTTP アクセスメソッドについてそのアクセス制御命令が適用されます。 すなわち、これは <Limit> セクションの逆で、 標準のメソッドと非標準ないしは認識できない メソッドの両方を制御するために使うことができます。

モジュールの拡張

mod_negotiation の改善
オプショナルのコンテントネゴシエーション (MultiViews) モジュールが Apache 1.3.4 で全体的に修正され、最新の HTTP/1.1 改訂版と実験的に RFC 2295 と RFC 2296 の Transparent Content Negotiation 機能が追加されました。
NEW - 綴り修正モジュール (訳注: mod_speling)
このオプショナルなモジュールは、サーバから要求された ドキュメントのパス名でしばしば見られる綴りや大文字小文字の 間違いを修正します。
NEW - 条件付き環境変数の設定 (訳注: mod_setenvif)
SetEnvIf ディレクティブと SetEnvIfNoCase ディレクティブが追加されました。 これにより、リクエストの属性に応じてサーバと CGI の環境変数を設定することができます。
NEW - "Magic" MIME タイプ (訳注: mod-mime_magic)
オプショナルな mod_mime_magic が追加されました。 このモジュールは、"マジックナンバー" やファイルの内容から 得られる情報を使用して、対象となるコンテンツの属性を調べます。 この情報は、ファイルの拡張子からそのファイルのメディアタイプを 決定できない場合に使用されます。
NEW - 一意に識別可能な ID (訳注: mod_unique_id)
mod_unique_id mod_unique_id を組み込むことで、あるヒットと他のヒットとを区別する ユニークな識別子を生成するようになります (ここでの 「ユニークな」 にはいくつか制限があります。) その識別子は、環境変数 UNIQUE_ID として参照することができます。
mod_proxy の拡張:
mod_includeの文字列比較の拡張
文字列に基づいた server-side include (SSI) のフロー制御 ディレクティブに未満 (<)、以下 (<=)、より大きい (>)、 以上 (>=) が含められました。以前は等しいか等しくないかの 比較しかできませんでした。
ServerRoot からの相対パスでの auth ファイル名指定
様々な認証モジュールの auth ファイル名の指定は、 フルパスで無い場合は ServerRoot からの相対パスとして 扱われるようになりました。
ディレクトリのインデックスの拡張:(訳注: mod_autoindex)
CGI スクリプトの出力のバッファリングの減少
以前のバージョンの Apache では、CGI スクリプトからの出力は、 サーバが内部的にバッファをしていて、バッファが一杯になるか CGI スクリプトが終了するまではクライアントに送られませんでした。 Apache 1.3 では、クライアントへのデータのバッファは、 バッファ中に何かがあって、サーバがスクリプトからのさらなる出力を 待っているときにいつでもフラッシュされます。これにより、CGI スクリプトは長い処理操作の間に部分的なステータス報告が可能になります。
AliasRedirect での正規表現のサポート
新規の AliasMatch, ScriptAliasMatch, と RedirectMatch ディレクティブで、正規表現でのパターンマッチを指定できるようになりました。 更に、新規の <DirectoryMatch>, <LocationMatch>, <FilesMatch> セクションにより、 正規表現を用いたセクション指定ができる新しい構文が提供されます。
mod_info への AddModuleInfo ディレクティブの追加
指定されたモジュールについて、表示させる追加情報を指定できるように なりました。
TransferLog が無い場合のログ収集の抑制
TransferLog ディレクティブが無い場合はログは 収集されません。これは他のログ用モジュールとの共用をサポートします。
ログの書式に名前を付ける機能
LogFormat ディレクティブが拡張され、特定のログフォーマットにニックネームを 付けることを可能になりました。毎回ログフォーマットの文字列を書く代わりに、 このニックネームを他の LogFormat ディレクティブの指定や CustomLog ディレクティブの指定で使うことができます。
条件付きログ収集
mod_log_config が環境変数に基づいたログ収集をサポート するようになりました。mod_log_referer と mod_log_agent は使用しないことが推奨されています。
mod_cern_meta をディレクトリ毎に設定可能
mod_cern_meta をディレクトリ毎に設定することができるようになりました。
RewriteMapディレクティブの新しいマップタイプ
mod_rewrite の RewriteMap ディレクティブに新しいマップ型 `Randomized Plain Text' と `Internal Function' が追加されました。これらのマップ型は 二つの機能を提供します: 一つは、書き換え用マップで参照される 値から対応する値をランダムに選択することができるようになりました (Reverse Proxy において、バックエンドのサーバを選ぶ場合に便利です)。 もう一つは、URL の一部を大文字か小文字のどちらかに変換することが できるようになりました (mod_rewrite を用いて大規模な バーチャルホスティングを行なう場合に便利です)。
CIDR と Netmask によるアクセス制御
mod_access ディレクティブは CIDR (Classless Inter-Domain Routing) 形式のプレフィックスの指定と、IP のアクセスリストの制御を より細かく設定できるネットマスクをサポートするようになりました。

API の追加と変更

モジュール作者とコードハッカー向け情報:

child_init
"heavy-weight process" につき1回呼ばれる Apache API の新規フェーズです。この後でリクエストの処理を行ないます。 これをすることで、モジュールがプロセス毎に行なう必要のあることを すべて設定することができます。 たとえば、データベースへの接続があります。
child_exit
"heavy-weight process" につき1回呼ばれる新規のフェーズで、 プロセスの終了時に呼ばれます。致命的な状況では (たとえばセグメンテーションフォールトや kill -9 された場合) 呼ばれないことに注意してください。child_init 関数と child_exit 関数は、子プロセスの生存期間と (Apache が回復できる見込みのない完全に致命的なイベントを除いて) 同じ生存期間を持つプールを渡されます。対照的に、モジュールの init 関数は親プロセスが終了したり再起動したりすると 消滅するプールを渡されます。
child_terminate
現在のリクエストを終了した後に子プロセスが終了すべきであることを 示すために子プロセスで使われます。
register_other_child
http_main.h を参照してください。 これは親プロセスで使用し、監視する子プロセスを登録します。 親プロセスは与えられたコールバック関数に状態を報告します。 この関数を使用すると、モジュールが生成する子プロセスは、 httpd の他の子プロセスと共に監視されるようになります。
piped_log
http_log.h を参照してください。この API は、パイプされたログを実装するための共通のコードを提供します。 特に、アーキテクチャがサポートしている場合は (つまり 現時点では Unix)、信頼性のあるパイプされたログを実装しています。
スコアボードの形式変更
スコアボードの形式はかなり変更されました。 普通スコアボードは "private" なインターフェースだとされているので、 ここでは紹介するにとどめておきます。
set_last_modified を三つに分割
古い set_last_modified 関数は、 Last-Modified ヘッダや、Etag ヘッダの設定、 (If-Modified-Since のような ) 条件付きリクエストの処理など、 複数の仕事をしていました。これらの機能は三つの関数、 set_last_modified, set_etag, meets_conditions に分割されました。 meets_conditions 関数の処理を簡単にするために requrest_rec 構造体に mtime がフィールドが追加されました。
エラーログ収集用の新規関数: ap_log_error
ログ収集用の古い関数はすべて非推奨となっています。 これらの関数を ap_log_error という単独の関数で置き換えようとしています。 これはまだ作業中です。
設定解析のための set_file_slot
set_file_slot ルーチンは、 絶対パスになっていないパスの前に ServerRoot を追加するための標準ルーチンを提供します。
post_read_request モジュール API
このリクエストフェーズはリクエスト (ヘッダ) を読み込んだ直後や、内部リダイレクトを作成した直後に起こります。 その後の段階に影響する環境変数を設定するために一番役に立ちます。
psocketpopendir
socket の生成において、競合状態が起こらないようにリソースの トラッキングをする psocket 関数と pclosesocket 関数が用意されました。同様に、popendir 関数と pclosedir 関数はディレクトリの読み込みを保護します。
is_initial_req
リクエストが初期リクエスト (すなわち、 クライアントから来るもの)であるかどうかを判定します。
kill_only_once
ap_spawn_child 関数のオプションで、 Apache が子プロセスを積極的に kill しようとすることを抑制します。
alloc デバッグ用コード
ALLOC_DEBUG を定義すると原始的なメモリデバッガが提供されます。 これを使う場合、生存中のサーバに与える影響が少なく済みます。 それは、割り当てられてるメモリおよび解放されるメモリのバイト数をすべて 0xa5 に設定します。ALLOC_USE_MALLOC を定義すると、 alloc コードがそれぞれのオブジェクトに対して malloc()free() を使うようになります。これはずっとコストが高く、 Electric Fence や Purify のようなツールを使ってテストをするときにのみ 使われるべきものです。詳細は main/alloc.c を参照してください。
ap_cpystrn
新しい strncpy のようなものですが、バッファ全体を 0 で満たす必要が無いために strncpy よりずっと速い点で若干違います。
table_addn, table_setn, table_mergen
これらの新しい関数は、引数に対して pstrdup を呼びません。これは大きな速度向上をもたらします。 コードがそれらを適切に使用していることを確かめるためのデバッグの サポートもあります。詳しい情報は src/CHANGES を参照してください。
construct_url
この関数のプロトタイプが server_rec * から request_rec * を引数として取るように変わりました。
get_server_name, get_server_port
リクエストに対応するサーバ名とポート番号を取得する際に UseCanonicalName ディレクティブを扱うためのラッパーです。
ap_bspawn_childap_call_exec のプロトタイプの変更
Win32 で子プロセスが正しく動作するように、 spawn 関数 (ap_bspawn_child に渡される) と ap_call_exec 関数に child_info * を追加しました。 また、spawn_child_err を単に ap_spawn_child で置き換え、 spawn_child_err_buff を単に ap_bspawn_child で置き換えることで、 関数名を少し整理しました。
ap_add_version_component()
この API 関数は Server: ヘッダに出力されるサーバトークンを、 モジュール自身が追加できるようにします。以前の 1.3beta バージョンではコンパイル時に #define された SERVER_SUBVERSION を定義してこの機能を実現していました。 トークンが実際に表示されるかどうかは新しい SeverTokens ディレクティブで制御されます。

その他の拡張

BS2000/OSD を実行している EBCDIC メインフレームマシンへの移植
(訳注: メインフレームマシンへの移植の ) 手始めとして、 このバージョンの Apache では、EBCDIC 文字セットを ネイティブコードセットとして使用するメインフレームマシンへの 移植のベータ版が付いています (IBM/390 互換のプロセッサー上で BS2000/OSD オペレーティングシステムを実行している SIEMENS のメインフレームファミリーです。このメインフレームの OS は、最近では SVR4 ライクの POSIX のサブシステムの機能があります)。
AccessFileName の拡張
AccessFileName ディレクティブは、複数のファイル名を 受け付けるようになりました。これにより、NFS を用いて複数の Apache サーバでページを提供しているサーバでの設定に応じたアクセスを設定 できるようになります。(訳注: NFS を用いて、同じコンテンツ空間を複数の サーバで共有していると、それらのサーバの AccessFileName が同じとは限りません。 共有しているコンテンツに対するアクセス制御は同じ設定を使いたいときに、 この機能が役に立ちます)。
HostnameLookups のデフォルトを "Off" に変更
HostnameLookups ディレクティブはデフォルトで "Off" になりました。明示的に on にしない限り、サーバは IP アドレスの名前解決を行なわないということです。 この変更はインターネットにおいてを不必要な DNS トラフィックを 発生させないために行なわれました。
DNS の二重逆引きの強制機能
HostnameLookups ディレクティブは DNS の二重逆引きをサポートするようになりました。 (tcp_wrapper の用語では PARANOID として知られているものです)。 IP アドレスに対して逆引きを行ない、さらに正引きして得られる IP アドレスのリストに元の IP アドレスが含まれていれば、 二重逆引きのテストを通過します。HostnameLookup の設定に関わらず、 mod_access アクセス制御の設定で DNS 名を使用している場合、すべての名前が DNS の二重逆引きテストに合格する ことを要求します。(以前のバージョンの Apache では、DNS の二重逆引きを可能にするためにコンパイル時のスイッチが必要でした。)
LogLevel と syslog のサポート
Apache はエラーのログ収集レベルを設定 できる機能が追加されました。また、syslogd(8) によるエラーのログ収集をサポートするようになりました。
標準入力/標準出力/標準エラー出力からの切離し
Apache は、ブート時に標準入力/標準出力/標準エラー出力を 切り離すようになりました。標準エラー出力は、設定ファイルの 読み込みに成功するまで切り離しません。ですから、設定ファイルの エラーは目にすることになるでしょう。これにより、rsh や crontab で Apache を起動しやすくなっているはずです。
2000 年問題の改善
mod_include で使われるデフォルトの timefmt 文字列が、以前使われていた 2 桁ではなく 4 桁を使うように 修正されました。mod_autoindex モジュールも FancyIndex されたディレクトリ一覧表示に 4 桁の年を表示するように修正されました。
共通のルーチンを独立したライブラリに分離
オペレーティングシステムによるライブラリのルーチンの違いを 補完したり置き換えたりする関数やルーチンが、Apache プロジェクトのために数多く開発されています。ほとんどのものは Apache サーバ自身でのみで使用されていますが、中には htdigest のようなサポート用アプリケーションで参照されているものもあります。 そして、そのルーチンはサーバにのみ組込まれているために、 このような別アプリケーションはビルドに失敗します。これらのルーチンを 別のサブディレクトリで別のライブラリに移動しました。これにより、 サーバだけでなく他のアプリケーションからも使えるようになりました。 src/ap/ サブディレクトリを参照してください。
新しい ServerSignature ディレクティブ
このディレクティブはサーバが作成したページ (エラードキュメント、 FTP のディレクトリ内容一覧、mod_info の出力 など) にサーバのバージョンとバーチャルホスト名を含む行をオプションで追加します。 これにより、特に pxory の連鎖 (イントラネットの環境ではよくあります) があるときに、どのサーバがエラーメッセージを出したのかをユーザが 簡単に知ることができるようになります。
新しい UseCanonicalName ディレクティブ
このディレクティブは、Apache がどのように自分自身を参照する URL を作成するかを制御します。以前の Apache では、 ServerName ディレクティブと Port ディレクティブを常に指定することで "正規化された" サーバの名を生成していました。UseCanonicalName off で、クライアントから提供されたホスト名とポート番号がある場合、 Apache はそれを使用するようになります。
SERVER_VERSION の定義の抽象化と サーバのビルド日時の追加
以前のバージョンでは、SERVER_VERSION で定義された値を通じて、モジュールは Apache サーバのバージョンを参照することができました。 コアサーバとモジュールが違う時にコンパイルされた場合でも この値の一貫性を保つために、この情報はコア API ルーチン ap_get_server_version() で得ることができるようになりました。SERVER_VERSION シンボルの仕様は非推奨です。 また、ap_get_server_built() はコアサーバがリンクされた 時刻を表す文字列を返します。
サーバの ID にオペレーティングシステムを含める
新しいディレクティブ ServerTokens により、 クライアントに送り返される Server レスポンスヘッダフィールドの値をウェブマスターが 変更できるようになりました。ServerTokens ディレクティブでは、サーバが動作しているオペレーティングシステムの 種類についての詳しすぎない程度の情報を、モジュール情報と同様にサーバ ID に含めるかどうかを制御します。Apache 1.3 では、 この追加の情報がデフォルトで含まれるようになっています。

Netscape 形式の SHA1 で暗号化されたパスワードのサポート
(Apache に組込まれている MD5 や、OS 固有の crypt(3) 関数と異なり) パスワードが SHA1 で暗号化されるような BasicAuth パスワード方式の移行や統合を促進するため、{SHA1} が前に付いているパスワードは Base64 で符号化された SHA1 パスワードとして解釈されます。さらなる情報や Netscape の ldap/ldif エントリを変換するためのユーティリティーは、 support/SHA1 にあります。

Apache HTTP Server

Index