Logo address

第 2.0 版と第 1.2a 版との主な違い

目次

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 ページの管理者がシステムの管理者であると想定し、そのために実ホスト独自の編成機能が貧弱だったのですが、今回は実ホストのドキュメントの管理者が、仮想ホストと同様に、独自に名前空間の再編成などができるようになりました。
図1. これまでの実ホストの扱い。実ホストは独自の設定を欠き全て基本編成に頼る。
図2. 今回導入された実ホストの扱い。基本編成のもとで、さらに独自の設定ができる。

$web/etc/namespace_80

namespace.cginamespace_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_PATHindex.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 のサポートも魅力的ですが、もう少し様子を見ましょう)