From: Yoshiki Hayashi Date: Wed, 11 Sep 2002 08:33:53 +0000 (+0000) Subject: New XML. X-Git-Tag: 2.0.42~81 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=77991b76b3e9ef80c5ca387ddd2c8f2c087acd0e;p=apache New XML. Submitted by: Hiroaki KAWAI git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@96756 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/docs/manual/dso.xml.ja b/docs/manual/dso.xml.ja new file mode 100644 index 0000000000..3822283f5b --- /dev/null +++ b/docs/manual/dso.xml.ja @@ -0,0 +1,275 @@ + + + + + + + + + 動的共有オブジェクト (DSO) サポート + + +

Apache HTTP サーバはモジュール化されたプログラムで、 + 管理者がモジュールを選択することでサーバに組み込む機能を選ぶことができます。 + モジュールはサーバがビルドされるときに httpd バイナリに + 静的に組み込むことができます。もしくは、httpd バイナリとは + 別に存在する動的共有オブジェクト (訳注: Dynamic Shared Object) + (DSO) としてコンパイルすることも + できます。DSO モジュールはサーバがビルドされるときにコンパイルしたり、 + Apache 拡張ツール (apxs) を + 使って後でコンパイルして追加したりできます。

+ +

この文書は DSO モジュールの使い方と、仕組みについて + 説明します。

+
+ + +
実装 + + + +mod_so + + +LoadModule + + + +

個々の Apache モジュールをロードするための DSO サポートは + mod_so.c というモジュールの機能に基づいています。 + このモジュール は Apache のコアに静的に組み込まれている必要があります。 + それは core.c 以外では DSO にできない唯一の + モジュールです。事実上、他のすべての Apache のモジュールは、 + インストールの文書で説明されているように、 + configure の + --enable-module=shared オプションでそれぞれを + DSO ビルドにすることにより、DSO モジュールにすることができます。 + mod_foo.so のような DSO にモジュールがコンパイルされれば、 + httpd.conf ファイル中で mod_so の + LoadModule + ディレクティブを使うことでサーバの起動や再起動時にこのモジュールを + ロードするようにできます。

+ +

Apache モジュール用の (特にサードパーティモジュールの) DSO ファイルの + 作成を簡単にするために、apxs + (APache eXtenSion) という新しいサポートプログラムがあります。 + Apache のソースツリーの外で DSO モジュールをビルドするために + 使うことができます。発想は単純です: Apache のインストール時の + configuremake install のときに Apache の + C ヘッダをインストールし、DSO ビルド用のプラットフォーム依存の + コンパイラとリンカのフラグを apxs プログラムに追加します。 + これにより、ユーザが Apache の配布ソースツリーなしで、さらに + DSO サポートのためのプラットフォーム依存のコンパイラやリンカの + フラグをいじることなく Apache のモジュールのソースをコンパイル + できるようになります。

+
+ +
使用法の概要 + +

Apache 2.0 の DSO 機能の概略を知ることができるための、 + 短く簡潔な概要です:

+ +
    +
  1. + 配布されている Apache モジュール、仮に mod_foo.c + として、それを DSO mod_foo.so にビルド、インストール: + + +$ ./configure --prefix=/path/to/install --enable-foo=shared
    +$ make install +
    +
  2. + +
  3. + サードパーティ Apache モジュール、仮に mod_foo.c + として、それを DSO mod_foo.so にビルド、インストール: + + +$ ./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c --enable-foo=shared
    +$ make install +
    +
  4. + +
  5. + 共有モジュールの 後々のインストール のために + Apache を設定: + + +$ ./configure --enable-so
    +$ make install +
    +
  6. + +
  7. + サードパーティ Apache モジュール、仮に mod_foo.c + として、それを apxs を使って + Apache ソースツリーの外で DSO にビルド、インストール: + + +$ cd /path/to/3rdparty
    +$ apxs -c mod_foo.c
    +$ apxs -i -a -n foo mod_foo.la +
    +
  8. +
+ +

どの場合においても、共有モジュールをコンパイルした後で、 + httpd.conf で + LoadModule + ディレクティブを使って Apache がモジュールを使用するように + しなければなりません。

+
+ +
背景 + +

最近の Unix 系の OS には 動的共有オブジェクト (DSO) + の動的リンク/ロードという気のきいた機構が + 存在します。これは、実行時にプログラムのアドレス空間に + ロードできるような特別な形式でプログラムをビルドすることを + 可能にします。

+ +

このロードは二つの方法で行なうことができます: 実行プログラムが + 起動されたときに lod.so というシステムプログラム + により自動的に行なわれる方法と、実行プログラム中から、システムコール + dlopen()/dlsym() による Unix ローダへの + プログラムシステムのインタフェースを使って手動で行なう方法とが + あります。

+ +

最初の方法では DSO は普通は共有ライブラリDSO + ライブラリ と呼ばれていて、DSO の名前は + libfoo.solibfoo.so.1.2 のようになっています。 + これらはシステムディレクトリ (通常 /usr/lib) に存在し、 + 実行プログラムへのリンクはビルド時に -lfoo をリンカに + 指定することで確立されます。これによりライブラリへの参照が実行プログラムの + ファイルに書き込まれて、起動時に Unix のローダが /usr/lib や、 + リンカの -R のようなオプションによりハードコードされたパス、 + 環境変数 LD_LIBRARY_PATH により設定されたパス、の中から + libfoo.so の場所を見つけることができます。それから、 + 実行プログラム中の (まだ未解決の) シンボルを DSO にあるシンボルで + 解決します。

+ +

普通は実行プログラム中のシンボルは DSO からは参照されません + (DSO は一般的なコードによる再利用可能なライブラリですので)。 + ですから、さらなるシンボルの解決は必要ありません。 + シンボルは Unix ローダにより完全な解決が行なわれますので、実行ファイル自身は + 何もする必要がありません。(実際のところ、静的でない方法でリンクされている + すべての実行プログラムに組み込まれている開始用のコードの一部に + ld.so を起動するコードが含まれています)。よく使われる + ライブラリの動的ロードの利点は明らかです。ライブラリのコードは + システムライブラリに libc.so のようにして一度保存するだけでよく、 + プログラムのために必要なディスクの領域を節約することができます。

+ +

二つめの方法では DSO は普通は共有オブジェクトや + DSO ファイルと呼ばれていて、任意の拡張子を付けることができます + (ただし、標準的な名前は foo.so です)。 + これらのファイルは通常はプログラム専用のディレクトリに置かれ、 + これらを使う実行プログラムへのリンクは自動的にはされません。 + ですので、実行プログラムは dlopen() を使って + 実行時に手動で DSO をプログラムのアドレス空間にロードする必要があります。 + この時点では実行プログラムに対して DSO のシンボルの解決は行なわれません。 + しかし、その代わりに Unix のローダが DSO の (まだ未解決の) シンボルを + 実行プログラムによりエクスポートされたシンボルと既にロードされた + DSO ライブラリによりエクスポートされたシンボル (特に、どこにでもある + libc.so のすべてのシンボル) で自動的に解決します。 + こうすることで、DSO は最初から静的にリンクされていたかのように、 + 実行プログラムのシンボルを知ることができます。

+ +

最後に、DSO の API を利点を生かすために、プログラムは + 後でディスパッチテーブルなどでシンボルを使うことができるように、 + dlsym() を使っていくつかのシンボルを解決します。 + すなわち: 実行プログラムは必要なすべてのシンボルを手動で解決しなければ + なりません。この機構の利点はプログラムのオプショナルな部分は + 必要になるまでロードする必要がない (だからメモリも消費しない) + ことです。必要ならば、基本プログラムの機能を拡張するために + これらの部分を動的にロードすることができます。

+ +

この DSO 機構は簡単なように見えますが、少なくとも一つ難しい点が + あります: プログラムを拡張するために DSO を使っているときに、 + DSO が実行プログラムからシンボルを解決する点です (二番目の方法)。 + これはなぜでしょうか。それは、DSO のシンボルを実行プログラムの + シンボルから「逆解決」するというのはライブラリの設計 + (ライブラリはそれを使用するプログラムのことは何も + 知らない) に反していて、この機能はすべてのプラットフォームに + あるわけではなく、標準化もされていないからです。 + 実際には実行プログラムのグローバルなシンボルは再エクスポートされることは + あまりなく、DSO から使うことができません。リンカにグローバルシンボルすべてを + エクスポートするようにさせる方法を見つけることが、実行時にプログラムを + 拡張するために DSO を使うときの一番の問題です。

+ +

共有ライブラリのアプローチが普通の方法です。DSO 機構はそのために + 設計されたものですから。したがって、その方法はオペレーティングシステムが + 提供するほとんどすべての種類のライブラリで使われています。 + 一方、プログラムの拡張のために共有オブジェクトを使用する、という方は + あまり使われていません。

+ +

1998 年の時点で、実行時に実際に機能拡張のために DSO 機構を使っている + ソフトウェアパッケージは少しだけでした: Perl 5 (XS 機構と DnaLoader モジュール + によるもの)、Netscape サーバなどです。Apache はすでに + モジュールの概念を使って機能拡張をしていて、内部的にディスパッチリストに + 基づいた外部モジュールの Apache コア機能へのリンクを行なっていましたので、 + バージョン 1.3 から、Apache も DSO 機構を使う仲間になりました。 + Apache は実行時に DSO を使ってモジュールをロードするようにすでに + 運命付けられていたのです。

+
+ +
利点と欠点 + +

上記の DSO に基づいた機能は以下の利点があります:

+ +
    +
  • 実際のサーバプロセスを組み立てるために、 + ビルド時に configure のオプションを使う代わりに + 実行時に httpd.conf の設定用コマンド + LoadModule + を使うことができますので、サーバパッケージの柔軟性が高まりました。 + たとえば、一つの Apache のインストールから + 違う構成のサーバ (標準版と SSL 版、最小構成と拡張版 [mod_perl, PHP3] + など) を実行することができます。
  • + +
  • インストールの後であっても、サーバのパッケージをサードパーティ + モジュールで簡単に拡張できるようになりました。これは、Apache コア + パッケージと、PHP3, mod_perl, mod_fastcgi など の追加の + パッケージを作成できるので、少なくともベンダのパッケージ管理者にとって + 大きな利点があります。
  • + +
  • Apache モジュールの開発が簡単になります。 + これは DSO/apxs の組み合わせにより、Apache ソースツリーの + 外で作業でき、開発中のモジュールの新しいバージョンを + 実行中の Apache サーバに組み込むために apxs -i と + apachectl restart を行なうだけで良くなるからです。
  • +
+ +

DSO には以下の欠点があります:

+ +
    +
  • すべてのオペレーティングシステムがプログラムのアドレス空間に + コードを動的ロードすることをサポートしているわではないので、 + プラットフォームによっては DSO 機構は使えません。
  • + +
  • Unix のローダがシンボルの解決をする必要ができたので、 + そのオーバヘッドによりサーバの起動時間が約 20% 遅くなっています。
  • + +
  • 位置非依存コード (PIC) (訳注 position independent code) は + 相対アドレスのために複雑なアセンブラのトリックが必要なことがあり、 + それは必ずしも絶対アドレスと同じくらいの速度がでるわけではありませんので、 + プラットフォームによってはサーバの実行速度が約 5% 遅くなります。
  • + +
  • DSO モジュールはすべてのプラットフォームで他の DSO に基づいた + ライブラリに対してリンクできる (ld -lfoo) + というわけではありませんので (たとえば、a.out のプラットフォームでは + この機能はありませんが、ELF のプラットフォームにはあります)、 + すべての種類のモジュールに DSO 機構を使えるわけではありません。 + 言い換えると、DSO ファイルとしてコンパイルされたモジュールの + 使えるシンボルは、 + Apache のコアのシンボル、C ライブラリ (libc) と + Apache コアが使っている他のすべての静的なライブラリと動的ライブラリの + シンボル、PIC による静的なライブラリ (libfoo.a) の + シンボルのみに制限されます。その他のコードを使う方法は、 + Apache コア自身がすでにそのコードへの参照があるようにするか、 + dlopen () を使ってコードを自分自身でロードするかの + どちらかしかありません。
  • +
+ +
+ +
diff --git a/docs/manual/handler.xml.ja b/docs/manual/handler.xml.ja new file mode 100644 index 0000000000..123a33b06a --- /dev/null +++ b/docs/manual/handler.xml.ja @@ -0,0 +1,146 @@ + + + + + + + + + Apache のハンドラの使用 + + +

Apache のハンドラの使用に関して記述しています。

+
+ +
+ ハンドラとは + + + mod_actions + mod_asis + mod_cgi + mod_imap + mod_info + mod_mime + mod_negotiation + mod_status + + + Action + AddHandler + RemoveHandler + SetHandler + + + + +

「ハンドラ」とは、ファイルが呼ばれたときに実行される動作の + Apache における内部表現です。 + 通常、ファイルはファイル型に基づいた暗黙のハンドラがあります。 + 普通はすべてのファイルは単にサーバに扱われますが、 + ファイルタイプの中には別に「ハンドル」(訳注: 扱う) + されるものもあります。

+ +

Apache 1.1 では、ハンドラを明示的に使用する機能が追加されました。 + ファイルの拡張子や置いている場所に基づいて、 + ファイル型と関係なくハンドラを指定することができます。 + これはより優雅な解決法という点と、ファイルにタイプハンドラの両方を関連付けることができるという点で優れています。 + (複数の拡張子のあるファイルも参照してください)。

+ +

ハンドラはサーバに組み込んだり、モジュールとして含めたり、 + Action + ディレクティブとして追加したりすることができます。 + 以下は標準配布に組み込まれているハンドラです。 +

+ +
    +
  • default-handler:default_handelr() + を使ってファイルを送ります。 + 静的なコンテンツを扱うときにデフォルトで使用されるハンドラです。 + (core)
  • + +
  • send-as-is: + HTTP ヘッダのあるファイルをそのまま送ります。 + (mod_asis)
  • + +
  • cgi-script: ファイルを CGI + スクリプトとして扱います。 + (mod_cgi)
  • + +
  • imap-file: + イメージマップのルールファイルとして解析します。 + (mod_imap)
  • + +
  • server-info: サーバの設定情報を取得します。 + (mod_info)
  • + +
  • server-status: サーバの状態報告を取得します。 + (mod_status)
  • + +
  • type-map: + コンテントネゴシエーションのためのタイプマップとして解析します。 + (mod_negotiation)
  • +
+
+
+ + +
+ CGI スクリプトを用いて静的なコンテンツを変更する + +

以下のディレクティブによって、拡張子が html + であるファイルは footer.pl + CGI スクリプトを起動するようになります。

+ + + Action add-footer /cgi-bin/footer.pl
+ AddHandler add-footer .html +
+ +

CGI スクリプトは希望の修正や追加を行なって、元々要求された文書 + (環境変数 PATH_TRANSLATED + で指されています) を送る責任があります。 +

+ +
+
+ HTTP ヘッダのあるファイル + +

以下のディレクティブは send-as-is + ハンドラを使用するように指示します。このハンドラは自分自身の HTTP + ヘッダを持っているファイルに使用されます。ここでは、拡張子に関わらず、 + /web/htdocs/asis ディレクトリにある全てのファイルは + send-as-is ハンドラによって扱われます。

+ + + <Directory /web/htdocs/asis>
+ SetHandler send-as-is
+ </Directory> +
+ +
+
+
+ プログラマ向けのメモ + +

ハンドラの機能を実装するために、利用すると便利かもしれないものが + Apache API + に追加されました。詳しく言うと、request_rec + 構造体に新しいレコードが追加されたということです。

+ + + char *handler + + +

もしモジュールがハンドラに関わりたい場合、 + やらなければならないことは、リクエストが invoke_handler + ステージに達する以前に r->handler + を設定することだけです。ハンドラはコンテントタイプの代わりに + ハンドラ名を使うようになっていること以外は、以前と同じように実装されています。 + 必ず要求されているわけではありませんが、メディアタイプ + の名前空間を侵さないように、ハンドラの名前にはスラッシュを含まない、 + ダッシュ (訳注: "-") で分離された名前を付ける習慣になっています。

+
+
diff --git a/docs/manual/upgrading.xml.ja b/docs/manual/upgrading.xml.ja new file mode 100644 index 0000000000..0812d019b7 --- /dev/null +++ b/docs/manual/upgrading.xml.ja @@ -0,0 +1,169 @@ + + + + + + + +1.3 から 2.0 へのアップグレード + + +

アップグレードを簡単にするために、既存の Apache ユーザに + 非常に重要な情報をこの文書にまとめています。これは短い + 注意書きとして書かれています。より詳しい情報は + 新機能の文書や + src/CHANGES ファイルで見つけられると思います。

+
+ +
+ コンパイル時の設定の変更 + +
    +
  • Apache は ビルド処理の設定 + に autoconflibtool を使うようになりました。 + このシステムは Apache 1.3 の APACI システムと似ていますが、 + まったく同じというわけではありません。
  • + +
  • 通常のコンパイルするかどうかを選択できるモジュール群に加えて、 + Apache 2.0 は + リクエスト処理の主な部分を マルチプロセッシング + モジュール (MPM) に移動しました。
  • +
+
+ +
+ 実行時の設定の変更 + +
    +
  • Apache 1.3 の時にコアサーバにあった多くのディレクティブは + MPM に移動しました。サーバに Apache 1.3 とできるだけ同じ振る舞いを + させたい場合は、prefork MPM を + 選んでください。他の MPM はプロセスの作成やリクエストの処理の + 制御に異なったディレクティブを使います。
  • + +
  • Proxy モジュール (mod_proxy) は + HTTP/1.1 に対応するために再構成されました。重要な変更としては、 + プロキシのアクセス制御が <Directory proxy:> ブロックの + 代わりに <Proxy> ブロックに置かれるようになった、というものが + あります。
  • + +
  • モジュールの中には、PATH_INFO (本当のファイル名の後に続く + パス情報) の扱いが変わったものがあります。以前はハンドラとして + 実装されていたものがフィルタとして実装されるようになったものは PATH_INFO + のあるリクエストを受け付けません。INCLUDES などのフィルタは + コアハンドラの上に実装されていますので、PATH_INFO 付きの + リクエストを拒否します。 + AcceptPathInfo + ディレクティブを使ってコアハンドラが PATH_INFO 付きのリクエストを + 受け付けるようにでき、それによって SSI で PATH_INFO を使う + 機能を復活させることができます。
  • + +
  • CacheNegotiatedDocs + ディレクティブは on もしくは off という引数を + 取るようになりました。既に存在している + CacheNegotiatedDocsCacheNegotiatedDocs on + に置き換えてください。
  • + +
  • + ErrorDocument + ディレクティブはテキストメッセージを + 示すために引数の最初に使われていた引用符を使わないようになりました。 + 代わりに、メッセージを二重引用符で囲むようになっています。 + 例えば、既存の + + + ErrorDocument 403 "Some Message + + は + + + ErrorDocument 403 "Some Message" + + + に置き換える必要があります。 + 二番目の引数は、有効な URL やパス名でない限り + テキストメッセージとして扱われます。 +
  • + +
  • AccessConfig ディレクティブと + ResourceConfig ディレクティブは削除されました。 + これらのディレクティブは同等の機能を持つ + Include で + 置き換えることができます。設定ファイルに取り込む代わりに、 + 上のディレクティブのデフォルト値を使っていた場合は、 + httpd.conf に Include conf/access.conf と + Include conf/srm.conf を追加する必要があるでしょう。 + 以前のディレクティブによる順番のように Apache が設定ファイルを + 読み込むようにするためには、httpd.conf の最後に + srm.confaccess.conf の順にそれぞれ + Include ディレクティブを書いてください。
  • + +
  • BindAddress ディレクティブと Port + ディレクティブは削除されました。同等の機能はより柔軟な + Listen + ディレクティブにより提供されています。
  • + +
  • Port ディレクティブは Apache-1.3 には自己参照 URL で + 使われるポート番号を設定する、という使用法もありました。 + これは Apache-2.0 では新しい + ServerName + 構文によって行ないます。一つのディレクティブでホスト名 + 自己参照 URL の両方を設定できるように構文が変更されました。
  • + +
  • ServerName ディレクティブは削除されました。 + リクエストを扱う方法は MPM の選択により決定されるようになりました。 + 現時点では inetd から起動されるように設計された MPM はありません。
  • + +
  • AgentLog ディレクティブ、 + RefererLog ディレクティブ、 + RefererIgnore ディレクティブを提供していた + mod_log_agent と mod_log_referer モジュールは削除されました。 + Agent ログと refere ログは mod_log_config の + CustomLog + ディレクティブにより実現可能です。
  • + +
  • AddModule ディレクティブと ClearModuleList + ディレクティブは削除されました。これらのディレクティブは、 + モジュールが正しい順番で呼ばれるようにするために使われていました。 + Apache 2.0 の新 API はモジュールが明示的に順番を指定できるように + なっており、これらのディレクティブは必要なくなりました。
  • + +
  • FancyIndexing ディレクティブは削除されました。 + 同じ機能は IndexOptions + ディレクティブの FancyIndexing オプションで + 実現できます。
  • +
+
+ +
+ その他の変更 + +
    +
  • バーチャルホストの設定を出力するために使われていた + httpd のコマンドラインオプション -S は + -t -D DUMP_VHOSTS に置き換えられました。
  • + +
  • Apache 1.3 で実験的なモジュールだった mod_auth_digest は + 標準モジュールになりました。
  • + +
  • Apache 1.3 で実験的なモジュールだった mod_mmap_static は + mod_file_cache で置き換えられました。
  • + +
  • Apache の配布は独立した src ディレクトリが + なくなるように、完全に再構成されました。その代わりに、 + ソースは主ディレクトリに論理的に配置されるようになり、 + コンパイルされたサーバのインストールは別ディレクトリへ + 行なうようになりました。
  • +
+
+ +
+ サードパーティモジュール + +

Apache 2.0 のサーバ API には多くの変更が加えられました。 + Apache 1.3 用の既存のモジュールは Apache 2.0 では修正なしでは + 動きません。詳細は 開発者向け文書 にあります。

+
+