第 2.0 版と第 1.2a 版との主な違い
目次- 1.0.0 バグの修正
- 1.1.0 POST method でクライアントから受け取るデータサイズの上限
- 1.2.0 CGI における HEAD メソッド
- 1.3.0 CGI における Proxy Cache
- 2.0.0 追加機能
- 2.1.0 持続的接続
- 2.2.0 DoS アタックに対する保護
- 2.3.0 redirection ループに対する保護
- 2.4.0
/sys/log/blacklist
- 2.5.0
/sys/lib/httpd.conf
- 3.0.0 仕様変更
- 3.1.0 実ホストに固有な編成のサポート
- 3.2.0
$web/etc/namespace_80
- 3.3.0 CGI の実行ファイル
- 3.4.0 URI 変換ファイル
- 3.5.0 実行ハンドラ
- 3.6.0 CGI の環境変数
REQUEST_URI
- 4.0.0 廃止された事
- 4.1.0 仮想ホストに対する
~user
- 4.2.0 httpd の
-d
オプション - 4.3.0 httpd の -r オプション
- 4.4.0 httpd の
-f
オプション - 5.0.0 CGI アプリ
- 5.1.0
formparse
- 5.2.0
webm
2003/01/11
今回の改訂は、様々なポート(80
, 443
, 8080
など)を併用しながらサーバを運用する場合に発生する管理上の問題点に焦点があてられています。柔軟に、わかりやすくサーバが運用される新たな仕組みが今回の改訂で提供されました。
今回の改訂内容は多岐にわたり、かつ仕様上の変更が発生しているので、2.0 版にしています。
バグの修正
POST method でクライアントから受け取るデータサイズの上限
32KB より大きなデータを受け取ったときに問題がありました。今回はこの問題を吟味し、上限を 10MB に変更しました。これ以上のデータが転送された場合には、受け取りを拒否します。CGI における HEAD メソッド
2.0 版までは CGI が HEAD メソッドを受け取ったときに問題がありました。2.0a 版で対応しました。CGI における Proxy Cache
CGI プログラムの応答を Cache させないようにしました。(2.0a 版)追加機能
持続的接続
CGI についても持続的接続が標準になっています。それとともにクライアントにリクエストの処理結果 (レスポンスステータス)を知らせる新しい方法が提供されています。DoS アタックに対する保護
持続的接続を悪用した攻撃に対する保護機能を導入しました。クライアントに許されるサーバへの接続数が制限されています。(これはサーバモードでのみ有効です)redirection ループに対する保護
redirection ループが発生した場合の保護機能を導入しました。redirection ループが発生すると単位時間あたりの爆発的なアクセスが発生します。今回は、このような爆発的なアクセスをコントロールします。DoS アタックにも効果があるはずです。(これはサーバモードでのみ有効です)/sys/log/blacklist
DoS アタックを試みたクライアントを /sys/log/blacklist
に記録します。それとともに、このクライアントのアクセスをガードします。このガードは httpd
をリセットするまで続きます。(これはサーバモードでのみ有効です)/sys/lib/httpd.conf
Pegasus の configuration ファイル /sys/lib/httpd.conf
を導入しました。Pegasus の default の設定より、このファイルの設定が優先します。このファイルが存在しないとき、あるいは設定が無い場合には、Pegasus の省略時の設定が使用されます。httpd
のオプションの方が、これらの設定より優先します。
仕様変更
以下の説明で$home
は web ドキュメントの管理者のホームディレクトリ、$web
は、その管理者が管理する web ルート(root) とします。この場合ドキュメントは $web/doc
以下のディレクトリに置かれることになります。例えば、ユーザ alice
の場合には $web
は/usr/alice/webです。実ホストと仮想ホストの
$web
の値は /sys/lib/httpd.rewrite
によって決定されます。実ホストに固有な編成のサポート
これまでは実ホストの web ページの管理者がシステムの管理者であると想定し、そのために実ホスト独自の編成機能が貧弱だったのですが、今回は実ホストのドキュメントの管理者が、仮想ホストと同様に、独自に名前空間の再編成などができるようになりました。$web/etc/namespace_80
namespace.cgi
が namespace_80
に変更されました。これはドキュメントの管理者がポートごとに名前空間を編成できるようになったことを意味しているだけではありません。これまではこのファイルは単に CGI のために存在しました。今回はCGI を使用していない場合にも、ここで編成編成された名前空間に従ってファイルの探索が行われるようになりました。(図3 および図4) 図3. これまでの namespace.cgi |
図4. 今回の namespace_80 |
CGI の実行ファイル
これまでは、ディレクトリ$web/bin/386 $web/bin/rcに置かれた仮想ホストやユーザに固有の実行ファイルは、
$web/etc/namespace.cgi
の中で /bin
にバインドしていましたが、今回はサーバの方で自動的にバインドするようにしました。
URI 変換ファイル
今回の改訂で、筆者が一番苦心したのは変換ファイル/sys/lib/httpd.rewrite
や $web/etc/rewrite
の仕様です。ポートごとに変換ファイルを持たせるのは、感心しません。なぜなら URI 変換の全体像が掴み難くなるからです。そこで1つの変換ファイルで済ませる可能性を追求しました。
変換ファイルの形式に仕様上の変更はありません。意味に僅かの変更が発生しました。変更点は自明なリダイレクションループの表現に意味を与えて積極的に受け入れたことです。これによって多数のポートを一括管理する変換ファイルの表現が、自然なものとなり、分かりやすくなりました。
実行ハンドラ
Pegasus 1.0 では/etc/handler
の中に、次の例# path mimetype ramfs execpath arg ... *.http - 0 $target *.html text/html 1 $target *.dx_html text/html 0 /bin/dxの最後の行のように
$target
が存在しない場合には、/bin/dx
の後に $target
を付加して解釈したのですが、これは廃止します。$target
が必要なら省略しないで書いて下さい。ですから次のように書きます。# path mimetype unused execpath arg ... *.http - 0 $target *.html text/html 1 $target *.dx_html text/html 0 /bin/dx $targetさらに、今回の改訂では
$target
で示されるファイルは実際に存在する必要はなくなりました。また、ramfs
は CGI を実行した場合には必ず生成されるようになりました。従って ramfs
の使用の有無を知らせるフィールドは意味がなくなりました。(とりあえず未使用のフィールドとして残してあります。)CGI の環境変数 REQUEST_URI
CGI の環境変数の REQUEST_URI
の仕様を変更しました。Pegasus は、クライアントから要求があったパスが "
/
" で終わると(つまりディレクトリ名が要求された場合)、この後に index.html
を追加して解釈します。これまでは、その時に本来の要求が "/
" で終わっていたことを CGI から知ることはできませんでした。今回の改訂ではこの場合には環境変数 REQUEST_URI
の値は本来の要求を、環境変数 REQUEST_PATH
が index.html
を付加した値を持つことにしました。廃止された事
仮想ホストに対する ~user
仮想ホストに対する ~user
のリクエストが拒否されます。virtual.co.jp
を仮想ホストのドメイン名とすると、これまでは、http://virtual.co.jp/~aliceのようなリクエストは、仮想ホストがディレクトリ
~alice
を持っていれば受け入れられたのですが、今回の改訂によって拒否されるようになりました。
仮想ホストというのはシステムの運用者から見たときには特別待遇のユーザに過ぎないのであり、それが内部にユーザらしきものを持って運用するのはおかしな事です。(サーバの又貸しにつながります。) 今回の改訂で採用された URI 変換アルゴリズムの自然な帰結としてこうしたことが拒否されるようになったので、その自然なアルゴリズムのまま 2.0 版を提供します。
httpd の -d
オプション
今回 /sys/lib/httpd.conf
が導入され、その中でサーバの名前を設定できるようになったので、httpd のオプションによるサーバの名前の設定を廃止します。httpd の -r オプション
/usr/web/
の代替えは /sys/lib/httpd.conf
で指定することにしました。(名称は base
になっています。)httpd の -f
オプション
これまでの版ではホスト名をいい加減に与えてアクセスするクライアント(ウイルスによる不正アクセスクライアント)を入り口で拒否してきました。 これは不正アクセスクライアントに対する単なる意地悪だったので httpd
に -f
オプションを与えることによって、この意地悪を取り消すことができるようになっていました。ところが、今回の改訂で採用された URI 変換アルゴリズムでは自然な帰結として必ず拒否されるようになったので、その自然なアルゴリズムのまま 2.0 版を提供します。CGI アプリ
formparse
formparse
がファイルを受け取れるようになりました。但し、現在の所、一度に受け取れるファイルは1つだけです。
webm
webm
は今回追加されたサーバアプリケーションです。webm
を使用するとクライアントからサーバにファイルを転送したり、サーバのファイルを削除したりできます。webm
は web のファイルマネージャとして機能し、FTP の代わりに使用でき、便利です。(WebDev のサポートも魅力的ですが、もう少し様子を見ましょう)