今回のリリースでの新しい特徴として、Apache の機能性の拡張について ここでは説明します。 コア部分のコードが大きく変わりましたので、初期のバージョンの Apache (および NCSA httpd) が受け付けたものでも、 新しい Apache では受けつけないものがあります。 なんらかの問題がある場合には 互換性に関してでチェックしてく ださい。
Apache 1.2 からのアップグレードは 「アップグレードに関して」 を読むと良いでしょう。
拡張: コア | パフォーマンス | 設定 | モジュール | API | その他
Configuration
における "Module" 行がが "AddModule" で置き換わり、構文が少し変わった
ことです。モジュールの作者にとっては、ユーザがモジュールを容易に
追加できるようにするための変更がいくつかなされています。
ProxyReceiveBufferSize
ディレクティブは、
mod_proxy
からの外部接続に対して、
より大きなネットワークバッファを与えます。
writev
を
使うようになっています。このルーチンでは
メモリのバッファへのコピーもできるだけ避けています。
その結果、大きなファイルの転送に使われる CPU 時間が少なくなります。
mmap
を用いて処理されます。
これで、バイトはカーネルによりディスクのバッファからネットワークの
バッファへ直接コピーされるだけになります。プログラムは、
バイトのあちこちへのコピーをしません。
(使用可能かつテストされているときのみ。) それは CPU 時間を減少させて
させてしまいます。
mod_log_config
は
コンパイル時にバッファへ書き込みをするように設定できるようになりました。
strncpy()
を結果全体を 0 で埋める必要のない
ap_cpystrn()
で置き換えました。これは
mod_include
の速度に劇的な効果があります。
詳しい情報は性能についての新しい ドキュメント を参照してください。
configure
スクリプトと、それに対応する
トップディレクトリの Makefile.tmpl
ファイルで、
それが実現されました。この目的は、GNU の Autoconf 形式の
フロントエンドを提供することです。しして、これまでの
src/Configure
関連要素のバッチ処理と、GNU 流の
ディレクトリ構成でのパッケージインストールの両方が可能になります。
古い設定方法で可能だったものオプションすべてに加えて、
Apache 柔軟にカスタマイズするためのたくさんの新しいオプションが
使用可能です。README.configure
と INSTALL
ファイルを
参照してください。
apxs
が作成されました。
これにより、プラットフォームに依存した DSO ビルド用のコマンドは
ユーザから完全に隠され、Apache のソースツリーの外でモジュールを
ビルドすることが容易になっています。
これを達成するために、APACI は Apache の C のヘッダファイルを
apxs
と一緒にインストールします。
/usr/local/apache/
へ変更/usr/local/etc/httpd/
から /usr/local/apache/
に変更されました。これはデフォルトの設定 (とドキュメント) の変更
だけです。もちろん、Apache を起動するときに -d
ServerRoot と -f httpd.conf を指定することで
変更することができます。
NameVirtualHost
という新しいディレクティブを仕様して IP アドレス:ポートの対を
指定することで、
HTTP/1.1 形式のバーチャルホストとは、クライアントからの
Host:
ヘッダにバーチャルホスト基づくものです。
以前はこのアドレスは暗黙の内にマシンの "メインアドレス" と
同じにしていましたが、これは数多くの問題を引き起こし、また
機能も十分ではありませんでした。設定の詳細についは
「Apache バーチャルホストドキュメンント」
を参照してください。
Include
ディレクティブ
Include
ディレクティブに出会うと、直ちに他の設定ファイルをその場所に
挿入します。
-S
を付けて Apache を
起動すると、VirtualHost
をどのようにパース
したかという情報を表示します。
これはバーチャルホストの設定をデバッグしようとする場合に
便利です。
SetEnvIf
ディレクティブと
SetEnvIfNoCase
ディレクティブが追加されました。
これにより、
リクエストの属性に応じてサーバと CGI の環境変数を設定することができます。
mod_mime_magic
が追加されました。
このモジュールは、"マジックナンバー" やファイルの内容から得られる情報
を使用して、対象となるコンテンツの属性を調べます。
この情報は、ファイルの拡張子からそのファイルのメディアタイプを
決定できない場合に使用されます。
UNIQUE_ID
として参照することができます。
ProxyVia
ディレクティブで "Via:" のサポートのオン/オフを切り替えることができます。
また、プライバシー上の理由から、外に出て行くヘッダから "Via:"
を削るようにすることができます。
NoProxy
ディレクティブ
と ProxyDomain
ディレクティブが追加されました。
イントラネットでの利用に便利です。
ProxyPassReverse
ディレクティブ命令が新規に追加されました。
これにより、HTTP のリダイレクトレスポンスにおける Location:
ヘッダ中の URL を調整することができます。
mod_include
の文字列比較の拡張mod_dir
モジュールが、
ディレクトリのインデックスファイルを扱う mod_dir と、ディレクトリ内のファイル一覧を
作成する mod_autoindex の
二つに分割されました。これにより、クリティカルなサーバから
インデックスの機能を外すことができます。
SuppressColumnSorting
キーワードで無効にできます。
SuppressHTMLPreamble
を
使うことができます。
IndexOptions
ディレクティブは、
キーワード引数に対してインクリメンタルプレフィックス
を使用できるようになりました
(Options
ディレクティブと同様に、機能に対するキーワードの機能の追加を +/- で
指定します)。
これにより、同じディレクトリに適用される複数の IndexOptions
ディレクティブを一つにまとめることができます。
IconHeight
と
IconWidth
でディレクトリの一覧表示での
<IMG>
タグの height 属性と width
属性を設定できます。
NameWidth
キーワードで、
"凝った"
ディレクトリ内容一覧 の桁数を設定できます。
アスタリスク `*' に設定すると、名前 (訳注: Name の部分) の幅は
自動的に調整されます。
Alias
と
Redirect
での正規表現のサポート
AliasMatch
,
ScriptAliasMatch
, と
RedirectMatch
ディレクティブで、正規表現でのパターンマッチを指定できるようになりました。
更に、新規の
<DirectoryMatch>
,
<LocationMatch>
,
<FilesMatch>
セクションにより、正規表現を用いたセクション指定ができる新しい構文が
提供されます。
AddModuleInfo
ディレクティブの追加
TransferLog
が無い場合のログ収集の抑制
TransferLog
ディレクティブが無い場合はログは
収集されません。これは他のログ用モジュールとの共用をサポートします。
LogFormat
ディレクティブが拡張され、特定のログフォーマットにニックネームを
付けることを可能になりました。毎回ログフォーマットの文字列を書く代わりに、
このニックネームを他の LogFormat
ディレクティブの指定や
CustomLog
ディレクティブの指定で使うことができます。
RewriteMap
ディレクティブの新しいマップタイプ
RewriteMap
ディレクティブに新しいマップ型
`Randomized Plain Text' と `Internal Function' が追加されました。
これらのマップ型は二つの機能を提供します: 一つは、書き換え用マップで
参照される値から対応する値をランダムに選択することができるように
なりました (Reverse Proxy において、バックエンドのサーバを選ぶ場合に
便利です)。もう一つは、URL の一部を大文字か小文字のどちらかに
変換することができるようになりました (mod_rewrite を用いて大規模な
バーチャルホスティングを行なう場合に便利です)。
モジュール作者とコードハッカー向け情報:
child_init
child_exit
child_init
関数と
child_exit
関数は、子プロセスの生存期間と
(Apache が回復できる見込みのない完全に致命的なイベントを除いて)
同じ生存期間を持つプールを渡されます。対照的に、
モジュールの init
関数は親プロセスが終了したり
再起動したりすると消滅するプールを渡されます。
child_terminate
register_other_child
http_main.h
を参照してください。これは親プロセスで使用し、
監視する子プロセスを登録します。親プロセスは
与えられたコールバック関数に状態を報告します。この関数を使用すると、
モジュールが生成する子プロセスは、httpd の他の子プロセスと共に
監視されるようになります。
piped_log
http_log.h
を参照してください。この API は、
パイプされたログを実装するための共通のコードを提供します。特に、
アーキテクチャがサポートしている場合は (つまり
現時点では Unix)、信頼性のあるパイプされたログを実装しています。
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
psocket
と popendir
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
ap_bspawn_child
と ap_call_exec
のプロトタイプの変更
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()
Server:
ヘッダに出力される
サーバトークンを、モジュールが自身が追加できるようにします。
以前の 1.3beta バージョンではコンパイル時に
#define
された SERVER_SUBVERSION
を
定義してこの機能を実現していました。トークンが実際に表示されるかどうかは
新しい SeverTokens
ディレクティブで制御されます。
AccessFileName
の拡張
AccessFileName
ディレクティブは、複数のファイル名を
受け付けるようになりました。これにより、NFS を用いて
複数の Apache サーバでページを提供しているサーバでの設定に応じた
アクセスを設定できるようになります。(訳注: NFS を用いて、
同じコンテンツ空間を複数のサーバで共有していると、それらのサーバの
AccessFileName が同じとは限りません。共有しているコンテンツに対する
アクセス制御は同じ設定を使いたいときに、この機能が役に立ちます)。
HostNameLookups
のデフォルトを "Off" に変更
HostNameLookups
ディレクティブはデフォルトで "Off" になりました。明示的に
on にしない限り、サーバは IP アドレスの名前解決を行なわない
ということです。
この変更はインターネットにおいてを不必要な DNS トラフィックを
発生させないために行なわれました。
HostnameLookups
ディレクティブは DNS の二重逆引きをサポートするようになりました。
(tcp_wrapper の用語では PARANOID として知られているものです)。
IP アドレスに対して逆引きを行ない、さらに正引きして得られる IP
アドレスのリストに元の IP アドレスが含まれていれば、二重逆引きのテストを
通過します。HostnameLookup の設定に関わらず、
mod_access アクセス制御の設定で
DNS 名を使用している場合、すべての名前が DNS の二重逆引きテストに
合格することを要求します。(以前のバージョンの
Apache では、DNS の二重逆引きを可能にするためにコンパイル時のスイッチが
必要でした。)
mod_include
で使われる
デフォルトの timefmt
文字列が、以前使われていた2桁ではなく
4桁を使うように修正されました。mod_autoindex
モジュールも FancyIndex されたディレクトリ一覧表示に4桁の年を
表示するように修正されました。
htdigest
のような
サポート用アプリケーションで参照されているものもあります。
そして、そのルーチンはサーバにのみ組込まれているために、
このような別アプリケーションはビルドに失敗します。これらのルーチンを
別のサブディレクトリで別のライブラリに移動しました。
これにより、サーバだけでなく他のアプリケーションからも使えるように
なりました。src/ap/
サブディレクトリを参照してください。
ServerSignature
ディレクティブ
UseCanonicalName
ディレクティブ
UseCanonicalName off
で、クライアントから提供されたホスト名とポート番号がある場合、
Apache はそれを使用するようになります。
SERVER_VERSION
の定義が抽象化と
サーバのビルド日時の追加
SERVER_VERSION
で定義された値を
通じて、モジュールは Apache サーバのバージョンを参照することができました。
コアサーバとモジュールが違う時にコンパイル
された場合でもこの値の一貫性を保つために、この情報はコア API ルーチン
ap_get_server_version()
で得ることができるようになりました。
SERVER_VERSION
シンボルの仕様は非推奨です。
また、ap_get_server_built()
はコアサーバがリンクされた
時刻を表す文字列を返します。
ServerTokens
により、
クライアントに送り返される Server
レスポンスヘッダ
フィールドの値をウェブマスターが変更できるようになりました。
ServerTokens
ディレクティブでは、
サーバが動作しているオペレーティングシステムの種類についての
詳しすぎない程度の情報を、モジュール情報と同様にサーバ ID に含めるか
どうかを制御します。Apache 1.3 では、この追加の情報が
デフォルトで含まれるようになっています。
{SHA1}
が前に付いている
パスワードは Base64 で符号化された SHA1 パスワードとして解釈されます。
さらなる情報や Netscape の ldap/ldif エントリを変換するための
ユーティリティーは、support/SHA1 にあります。