e50dced6f51b101fcf63e1b51ebf771287870107yoshiki<!DOCTYPE modulesynopsis SYSTEM "/style/modulesynopsis.dtd">
e50dced6f51b101fcf63e1b51ebf771287870107yoshiki<?xml-stylesheet type="text/xsl" href="/style/manual.ja.xsl"?>
ed70c6537ec56d185d88a4aa7c0418d28bb7cdc7covener<!-- English Revision: 420990:1657407 (outdated) -->
031b91a62d25106ae69d4693475c79618dd5e884fielding Licensed to the Apache Software Foundation (ASF) under one or more
031b91a62d25106ae69d4693475c79618dd5e884fielding contributor license agreements. See the NOTICE file distributed with
031b91a62d25106ae69d4693475c79618dd5e884fielding this work for additional information regarding copyright ownership.
031b91a62d25106ae69d4693475c79618dd5e884fielding The ASF licenses this file to You under the Apache License, Version 2.0
031b91a62d25106ae69d4693475c79618dd5e884fielding (the "License"); you may not use this file except in compliance with
031b91a62d25106ae69d4693475c79618dd5e884fielding the License. You may obtain a copy of the License at
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd Unless required by applicable law or agreed to in writing, software
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd distributed under the License is distributed on an "AS IS" BASIS,
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd See the License for the specific language governing permissions and
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd limitations under the License.
208651a016b098f4fa1f6279559f104d70f1632dtakashi<description>それぞれのリクエストに対する一意な識別子の入った環境変数を
208651a016b098f4fa1f6279559f104d70f1632dtakashi提供する</description>
208651a016b098f4fa1f6279559f104d70f1632dtakashi <p>このモジュールは非常に制限された条件下で、
208651a016b098f4fa1f6279559f104d70f1632dtakashi それぞれのリクエストに「すべて」のリクエストに対して
208651a016b098f4fa1f6279559f104d70f1632dtakashi 一意に決まることが保証されている魔法のトークンを提供します。
208651a016b098f4fa1f6279559f104d70f1632dtakashi この一意な識別子は、適切に設定されたクラスタでは複数の
208651a016b098f4fa1f6279559f104d70f1632dtakashi マシンの間でさえも一意になります。それぞれのリクエストに対して環境変数
208651a016b098f4fa1f6279559f104d70f1632dtakashi 一意な識別子が便利な理由はいろいろありますが、
208651a016b098f4fa1f6279559f104d70f1632dtakashi このドキュメントの目的からは外れるため、ここでは説明しません。</p>
208651a016b098f4fa1f6279559f104d70f1632dtakashi <p>まずはじめに、Apache サーバが Unix
208651a016b098f4fa1f6279559f104d70f1632dtakashi マシンでどのように動作をするかを簡単に説明します。
208651a016b098f4fa1f6279559f104d70f1632dtakashi この機能は現時点では Windows NT ではサポートされていません。
208651a016b098f4fa1f6279559f104d70f1632dtakashi Unix マシンでは Apache はいくつかの子プロセスを作成し、
208651a016b098f4fa1f6279559f104d70f1632dtakashi その子プロセスが一つずつリクエストを処理します。それぞれの子プロセスは、
208651a016b098f4fa1f6279559f104d70f1632dtakashi 生存期間中に複数のリクエストを扱うことができます。
208651a016b098f4fa1f6279559f104d70f1632dtakashi この議論では子プロセス間では一切データを共有しないことにします。
208651a016b098f4fa1f6279559f104d70f1632dtakashi <p>あなたのウェブサイトにはあなたが管理するいくつかのマシンがあるとします。
208651a016b098f4fa1f6279559f104d70f1632dtakashi それらをまとめてクラスタと呼ぶことにします。それぞれのマシンは複数の
208651a016b098f4fa1f6279559f104d70f1632dtakashi Apache を実行することもできます。
208651a016b098f4fa1f6279559f104d70f1632dtakashi これらすべてをまとめたものが「宇宙」であると考えられます。
208651a016b098f4fa1f6279559f104d70f1632dtakashi いくつかの仮定の下で、クラスタのマシン間がたくさん通信をすることなく、
208651a016b098f4fa1f6279559f104d70f1632dtakashi この宇宙の中でそれぞれのリクエストに一意な識別子を生成できることを示します。
208651a016b098f4fa1f6279559f104d70f1632dtakashi <p>クラスタにあるマシンは以下の要求を見たさなければなりません。
208651a016b098f4fa1f6279559f104d70f1632dtakashi (マシンが一つだけだとしても、NTP で時計を合わせる方が良いです。)</p>
208651a016b098f4fa1f6279559f104d70f1632dtakashi <li>NTP や他のネットワーク上で時間を合わせるプロトコルによって
208651a016b098f4fa1f6279559f104d70f1632dtakashi 各マシンの時間の同期が取られていること。</li>
208651a016b098f4fa1f6279559f104d70f1632dtakashi <li>モジュールがホスト名を引いて違う IP
208651a016b098f4fa1f6279559f104d70f1632dtakashi アドレスを受け取ることができるように、
208651a016b098f4fa1f6279559f104d70f1632dtakashi クラスタのそれぞれのマシンのホスト名が違うこと。</li>
208651a016b098f4fa1f6279559f104d70f1632dtakashi <p>オペレーティングシステムにおいては、pid (プロセス ID) が
208651a016b098f4fa1f6279559f104d70f1632dtakashi 32 ビットの範囲内であることを仮定します。オペレーティングシステムの
208651a016b098f4fa1f6279559f104d70f1632dtakashi pid が 32 ビットを超える場合は、簡単な修正ではありますが、
208651a016b098f4fa1f6279559f104d70f1632dtakashi コードを変更する必要があります。</p>
208651a016b098f4fa1f6279559f104d70f1632dtakashi <p>これらの仮定が満たされていると、ある時点において、
208651a016b098f4fa1f6279559f104d70f1632dtakashi クラスタ内のどのマシンのどの httpd
208651a016b098f4fa1f6279559f104d70f1632dtakashi プロセスでも、一意に同定することができます。これはマシンの IP
208651a016b098f4fa1f6279559f104d70f1632dtakashi アドレスと httpd プロセスの pid で十分に行なうことができます。
208651a016b098f4fa1f6279559f104d70f1632dtakashi ですから、リクエストに一意な識別子を生成するためには、
208651a016b098f4fa1f6279559f104d70f1632dtakashi 時刻を区別する必要があるだけです。</p>
208651a016b098f4fa1f6279559f104d70f1632dtakashi <p>時刻を区別するために、Unix のタイムスタンプ (UTC の 1970 年
208651a016b098f4fa1f6279559f104d70f1632dtakashi 1 月 1 日からの秒数) と、16 ビットのカウンタを使います。
208651a016b098f4fa1f6279559f104d70f1632dtakashi タイムスタンプの粒度は一秒ですので、一秒間の 65536
208651a016b098f4fa1f6279559f104d70f1632dtakashi までの値を表現するためにカウンタを使用します。四つの値
208651a016b098f4fa1f6279559f104d70f1632dtakashi <em>( ip_addr, pid, time_stamp, counter )</em> で各 httpd
208651a016b098f4fa1f6279559f104d70f1632dtakashi プロセスで一秒の間に 65536 リクエストを数えあげることができます。
208651a016b098f4fa1f6279559f104d70f1632dtakashi 時間が経つと pid が再利用されるという問題がありますが、
208651a016b098f4fa1f6279559f104d70f1632dtakashi この問題を解決するためにカウンタが使用されます。</p>
208651a016b098f4fa1f6279559f104d70f1632dtakashi <p>httpd の子プロセスが作成されると、カウンタは
208651a016b098f4fa1f6279559f104d70f1632dtakashi (その時点のマイクロ秒 ÷ 10) modulo 65536 で初期化されます
208651a016b098f4fa1f6279559f104d70f1632dtakashi (この式はいくつかのシステムにある、マイクロ秒の
208651a016b098f4fa1f6279559f104d70f1632dtakashi タイマの下位ビットが異なるという問題を解決するために選ばれました)。
208651a016b098f4fa1f6279559f104d70f1632dtakashi 一意な識別子が生成されたとき、使用されるタイムスタンプは
208651a016b098f4fa1f6279559f104d70f1632dtakashi ウェブサーバにリクエストが到着した時刻になります。
208651a016b098f4fa1f6279559f104d70f1632dtakashi カウンタは識別子が生成されるたびに増加します
208651a016b098f4fa1f6279559f104d70f1632dtakashi (あふれた場合は 0 に戻ります)。</p>
208651a016b098f4fa1f6279559f104d70f1632dtakashi <p>カーネルはプロセスをフォークすると、それぞれのプロセスのために
208651a016b098f4fa1f6279559f104d70f1632dtakashi pid を生成します。pid は繰り返されることが許可されています
208651a016b098f4fa1f6279559f104d70f1632dtakashi (pid の値は多くの Unix では 16 ビットですが、新しいシステムでは
208651a016b098f4fa1f6279559f104d70f1632dtakashi 32 ビットに拡張されています)。
208651a016b098f4fa1f6279559f104d70f1632dtakashi ですから、ある程度の時間が経過すると同じ pid が再び使用されます。
208651a016b098f4fa1f6279559f104d70f1632dtakashi しかし、一秒内に再使用されなければ、
208651a016b098f4fa1f6279559f104d70f1632dtakashi 四つの値の一意性は保たれます。つまり、我々はシステムが一秒間
208651a016b098f4fa1f6279559f104d70f1632dtakashi に 65536 個のプロセスを起動しないと仮定しています (いくつかの Unix
208651a016b098f4fa1f6279559f104d70f1632dtakashi では 32768 プロセスですが、それですらほとんどあり得ないでしょう)。</p>
208651a016b098f4fa1f6279559f104d70f1632dtakashi <p>何らかの理由で、同じ時刻が繰り返されたとしましょう。
208651a016b098f4fa1f6279559f104d70f1632dtakashi つまり、システムの時計が狂っていて、もう一度過去の時刻になってしまった
208651a016b098f4fa1f6279559f104d70f1632dtakashi (もしくは進みすぎていたときに、
208651a016b098f4fa1f6279559f104d70f1632dtakashi 正しい時刻に戻したために再び将来の時刻になってしまった) とします。
208651a016b098f4fa1f6279559f104d70f1632dtakashi この場合、pid とタイムスタンプが再使用されることが簡単に示されます。
208651a016b098f4fa1f6279559f104d70f1632dtakashi カウンタ初期化用の関数は、この問題の回避を手助けしようと選択されています。
208651a016b098f4fa1f6279559f104d70f1632dtakashi 本当はカウンタの初期化をするためにランダムな数字を使いたいのですが、
208651a016b098f4fa1f6279559f104d70f1632dtakashi ほとんどのシステムでは簡単に使用できる数は無いことに注意してください
208651a016b098f4fa1f6279559f104d70f1632dtakashi を与える必要があり、seed には時刻を使えません。一秒単位では、
208651a016b098f4fa1f6279559f104d70f1632dtakashi その時刻はすでに繰り返されているからです)。
208651a016b098f4fa1f6279559f104d70f1632dtakashi これは、完璧な対策ではありません。</p>
208651a016b098f4fa1f6279559f104d70f1632dtakashi <p>この対策はどのくらい効果があるでしょうか?
208651a016b098f4fa1f6279559f104d70f1632dtakashi ここでは、マシン群の中の一つは最大で一秒に 500
208651a016b098f4fa1f6279559f104d70f1632dtakashi リクエストを扱うと仮定します (これを書いている時点では妥当な上限です。
208651a016b098f4fa1f6279559f104d70f1632dtakashi 通常システムがすることは静的なファイルを取りだすだけではありませんから)。
208651a016b098f4fa1f6279559f104d70f1632dtakashi それを行なうために、そのマシンは並行して来るクライアントの数に
208651a016b098f4fa1f6279559f104d70f1632dtakashi 応じた数の子プロセスを要求します。
208651a016b098f4fa1f6279559f104d70f1632dtakashi しかしながら、悲観的に考えて、一つの子プロセスが一秒に 500
208651a016b098f4fa1f6279559f104d70f1632dtakashi リクエストを扱えるとします。そうすると、(一秒の精度において)
208651a016b098f4fa1f6279559f104d70f1632dtakashi 時刻が同じ時を繰り返すと、この子プロセスがカウンタの値を再び使い、
208651a016b098f4fa1f6279559f104d70f1632dtakashi 一意性が壊れる可能性が 1.5% あります。
208651a016b098f4fa1f6279559f104d70f1632dtakashi これは非常に悲観的な例で、実世界の値では、ほとんど起こりそうにありません。
208651a016b098f4fa1f6279559f104d70f1632dtakashi それでもこれが起こる可能性のあるようなシステムなら、
208651a016b098f4fa1f6279559f104d70f1632dtakashi (プログラムコードを編集して)
208651a016b098f4fa1f6279559f104d70f1632dtakashi カウンタを 32 ビットにするのが良いでしょう。
208651a016b098f4fa1f6279559f104d70f1632dtakashi <p>サマータイムにより時計が「戻される」ことを気にしている人が
208651a016b098f4fa1f6279559f104d70f1632dtakashi いるかもしれません。ここで使用される時間は UTC であり、
208651a016b098f4fa1f6279559f104d70f1632dtakashi それは「常に」進むのでここでは問題になりません。x86 上の Unix
208651a016b098f4fa1f6279559f104d70f1632dtakashi はこの条件を満たすために適切な設定が必要かもしれないことに
208651a016b098f4fa1f6279559f104d70f1632dtakashi 注意してください。マザーボードの時計は UTC になっていて、
208651a016b098f4fa1f6279559f104d70f1632dtakashi 他の時間はそこから適切に補正されることを仮定できるように
208651a016b098f4fa1f6279559f104d70f1632dtakashi 設定されなければなりません。そのような場合でさえ、NTP
208651a016b098f4fa1f6279559f104d70f1632dtakashi を使っているならばリブート後にすぐ正しい UTC の時間になるでしょう。</p>
208651a016b098f4fa1f6279559f104d70f1632dtakashi アドレス、32 ビット pid, 32 ビットタイムスタンプ、16
208651a016b098f4fa1f6279559f104d70f1632dtakashi を用いて MIME の base64 符号化と同様の方法により符号化し、19
208651a016b098f4fa1f6279559f104d70f1632dtakashi の文字を生成することにより作成されます。MIME の base64
208651a016b098f4fa1f6279559f104d70f1632dtakashi では特別な符号化が必要なので、あまり望ましくありません。
208651a016b098f4fa1f6279559f104d70f1632dtakashi 全ての値はネットワークバイトオーダで符号化されますので、
208651a016b098f4fa1f6279559f104d70f1632dtakashi 符号は違ったバイトオーダのアーキテクチャ間で比較可能です。
208651a016b098f4fa1f6279559f104d70f1632dtakashi 実際の符号化の順番は: タイムスタンプ、IP アドレス、pid,
208651a016b098f4fa1f6279559f104d70f1632dtakashi カウンタです。この順には目的がありますが、
208651a016b098f4fa1f6279559f104d70f1632dtakashi アプリケーションは符号を解析するべきではないことを強調しておきます。
208651a016b098f4fa1f6279559f104d70f1632dtakashi 全体を透過的なトークンとして扱うべきです。
208651a016b098f4fa1f6279559f104d70f1632dtakashi との等価性を調べるためだけにのみ使用できます。</p>
208651a016b098f4fa1f6279559f104d70f1632dtakashi のデータベースとの衝突を心配することなく符号を変更することが
208651a016b098f4fa1f6279559f104d70f1632dtakashi 可能になるように選択しています。
208651a016b098f4fa1f6279559f104d70f1632dtakashi 新しい符号はタイムスタンプを最初の要素として残すのが望ましく、
208651a016b098f4fa1f6279559f104d70f1632dtakashi それ以外は同じアルファベットとビット長を使うことができます。
208651a016b098f4fa1f6279559f104d70f1632dtakashi タイムスタンプは本質的に増加系列ですので、
208651a016b098f4fa1f6279559f104d70f1632dtakashi クラスタの全てのマシンがリクエストとサーバ機能を停止して、
208651a016b098f4fa1f6279559f104d70f1632dtakashi その後は、リクエストを再開し、
208651a016b098f4fa1f6279559f104d70f1632dtakashi 新しい符号を発行することができるようになります。</p>
208651a016b098f4fa1f6279559f104d70f1632dtakashi この問題に対する比較的移植性の高い解決法だと考えています。
208651a016b098f4fa1f6279559f104d70f1632dtakashi Windows NT のようなマルチスレッドのシステムに拡張することができますし、
208651a016b098f4fa1f6279559f104d70f1632dtakashi 将来必要になればさらに増やすこともできます。
208651a016b098f4fa1f6279559f104d70f1632dtakashi ID は必要に応じて長くすることができますので、生成された ID
208651a016b098f4fa1f6279559f104d70f1632dtakashi は実質上、無限に有効です。また、クラスタのマシン間の通信も事実上必要なく
208651a016b098f4fa1f6279559f104d70f1632dtakashi (NTP による同期のみが必要で、これはオーバヘッドはあまりありません)、httpd
208651a016b098f4fa1f6279559f104d70f1632dtakashi プロセス間の通信も必要ありません (通信はカーネルにより割り当てられた
208651a016b098f4fa1f6279559f104d70f1632dtakashi pid の値により暗黙の内に行なわています)。
208651a016b098f4fa1f6279559f104d70f1632dtakashi さらに限られた状況下では、ID はさらに短くすることができますが、
208651a016b098f4fa1f6279559f104d70f1632dtakashi より多くの情報を仮定する必要がでてきます (例えば、32 ビット
208651a016b098f4fa1f6279559f104d70f1632dtakashi IP アドレスはどのサイトにおいても過剰な情報ですが、
208651a016b098f4fa1f6279559f104d70f1632dtakashi それの代わりになる移植性のあるものはありません)。</p>
e50dced6f51b101fcf63e1b51ebf771287870107yoshiki</modulesynopsis>