今回のリリースでの新しい特徴として、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
モジュール APIpsocket
と
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 にあります。