=================================================================== Tommygun WWW Server ver. 3 -- A Very Simple Web Server Copyright (c) 2001 Mikio Hirabayashi. All rights reserved. =================================================================== ☆はじめに このディレクトリには、非常にシンプルなWebサーバプログラムが納められ ています。このサーバは、HTTP1.0に基づき、クライアントからの要求に応 答してHTMLやその他の形式のデータを返信します。 クライアントからHTTP0.9の要求を受け付けた場合は、HTTP0.9として返信 を行います。HTTP1.1の要求を受け付けた場合は、HTTP1.0との互換部分だ けを解釈してHTTP1.0で返信します。要求メソッドについてはGET、HEAD、 POST、PUT、DELETEに対応しています。また、CGI1.1に基づいたスクリプト の実行と、絶対URI要求へのプロクシ動作も行います。さらに、独自のハン ドラ機能によって任意のゲートウェイが利用できます。 このサーバの機能は、Apache等の本格的なWebサーバには全く及びません。 しかし、非常に手軽に使えるのが特徴です。デーモンプロセスではありま すが、設定ファイルが不要であり、一般ユーザがコマンドラインから気軽 に起動できるように設計されています。このサーバを使えば、気が向いた 時に、任意のポートで、任意のコンテンツを対象として、任意のWebサービ スを開始し、また終了することができます。 ☆動作環境とインストール このサーバはLinuxシステム上で開発および動作確認をしています。SunOS 等の他のUNIX環境に移植するには、ソースコードを書き換えるなど、多少 の作業が必要となるでしょう。ここでは GNU Make と GCC を用いたイン ストール手順を説明しますが、知識のある方なら別のツールを用いてもよ いでしょう。 まず、シェル上で以下のコマンドを実行してください。 make すると、プログラムがコンパイルされ、実行ファイル tommygun が作成さ れます。ここでエラーが出た場合はあなたのシステムに必要な開発ツール やヘッダファイルやライブラリがインストールされていない可能性を考え てください。 次に、root ユーザになってから、シェル上で以下を実行してください。 make install すると、/usr/local/bin に tommygun とその他のユーティリティがインス トールされます。root ユーザになれない人や、別のディレクトリにインス トールしたい場合は、単に cp コマンド等で tommygun をコピーや移動し ても構いません。 ☆使い方 実行ファイル tommygun を実行すればよいです。引数には、Webサービスで 公開したい「ドキュメントルート」ディレクトリを指定します。省略した 場合はカレントディレクトリが用いられます。 例えば /home/mikio/public_html 以下を公開したい場合は、以下のように します。 tommygun /home/mikio/public_html 一見何事も起こらないようですが、エラーメッセージが出なければWebサー ビスが開始されているはずです。もし tokyo.transpacific.go.jp という 名のホストを使っているならば、ブラウザ等で以下のURLを要求してみると Webサービスの起動が確認できます。 http://tokyo.transpacific.go.jp:8800/ サーバを終了させる時は、シグナルを利用します。自分が起動した全ての tommygun のプロセスを終了させたければ、以下のコマンドを実行します。 killall tommygun 以下のオプションを用いて、サーバの挙動を変更することができます。 -host host バインドするホスト名を指定 -port port バインドするポート番号を指定 -rhost host リモートプロクシの使用とそのホスト名を指定 -rport port リモートプロクシのポート番号を指定 -part num 接続待機プロセスの数を指定 -log file ログファイルのファイル名を指定 -addh header 追加するヘッダを指定 -deft type デフォルトのメディアタイプを指定 -auth id:pass 基本認証の使用とそのユーザIDとパスワードを指定 -index index インデックスのファイル名を指定 -gate str CGIスクリプトの接尾辞か接尾辞を指定 -hand str cmd 接頭辞か接尾辞とハンドラの対応関係を指定 -type suf type 接尾辞とメディアタイプの対応関係を指定 -over met cmd メソッドとハンドラの対応関係を指定 -put PUTメソッドを許可 -del DELETEメソッドを許可 -np プロクシの動作を禁止 -nl 動的なインデックス生成を禁止 -al 動的なインデックス生成で、隠しファイルも表示 -rg ゲートウェイを非解析ヘッダスクリプトとして実行 -v ログ出力を冗長化 -debug デーモンにならないデバッグモード デフォルトでは、ホスト名に自ホストの標準名を用い、ポート番号に 8800 を用います。プロクシとしても動作しますが、リモートプロクシは用いま せん。リモートプロクシを用いる場合のポート番号は 8080 となります。 クライアントからの接続を待機するプロセスはひとつです。通常のリソー スのメディアタイプには text/plain が用いられます。認証機構は作動さ せません。ディレクトリのインデックスファイルは指定されません。ディ レクトリ要求時にインデックスファイルがなかった場合は、動的にファイ ルリストのインデックスページが生成されます。その際、ドットで始まる ファイルはリストされません。CGIスクリプトとして実行するリソースはあ りません。ハンドラに実行されるリソースはありません。メソッドはGETと HEADとPOSTを受け付けますが、PUTとDELETEは許可されません。CGIスクリ プトのヘッダはサーバが解析します。アクセスログは記録しません。 例えば、ホスト名 santiago のポート 1080 番にバインドし、デフォルト のメディアタイプを application/octet-steram にし、ディレクトリのイ ンデックスとして index.html と index.text を順に探すようにし、接尾 辞が .cgi のファイルはCGIスクリプトとして実行し、接尾辞が .html の ファイルはメディアタイプ text/html にし、同じく .gif のファイルは image/gif にし、ファイル /tmp/tglog に冗長なログを出力し、ドキュメ ントルートを /home/wwwにするなら以下ようにします。 tommygun -host localhost -port 1080 \ -type application/octet-steram \ -index index.html -index index.text \ -gate cgi -tsuf .html text/html -tsuf .gif image/gif \ -log /tmp/tglog -v /home/www ホスト名 santiago のポート 8888 番にバインドする場合は以下のように します。HTTPサーバは必ず特定のホスト名(IPアドレス)とポート番号に バインドする必要がありますが、ホスト名を明示しなかった場合は全ての ネットワークインタフェースを対象として指定されたポートをバインドし ます。 tommygun -host santiago -port 1080 インデックスとして index.html と index.text を順に探すようにするに は以下のようにします。インデックスとは、ディレクトリのURIが要求さ れた際に送信されるコンテンツであり、そのディレクトリの中の特定の名 前のファイルが利用されます。インデックスが見つからない場合は、その ディレクトリの中にあるファイルの一覧を示すHTMLデータが動的に生成さ れて送信されます。 tommygun -index index.html -index index.text インデックスが見つからない場合に動的にインデックスを生成するのでは なく、エラーを出したい場合は以下のようにします。 tommygun -index index.html -index index.text -nl 動的なインデックス生成では、ドット(.)で始まるファイルはリストさ れません。そういった隠しファイルもリストさせたい場合は以下のように します。 tommygun -index index.html -index index.text -al デフォルトのメディアタイプを application/octet-stream にし、接尾辞 が .html のファイルを text/html にする場合は以下のようにします。メ ディアタイプとは、クライアントが受信したデータをどのように処理すべ きかを指定するものです。 tommygun -type application/octet-stream -tsuf .html text/html 接頭辞が /cgi-bin/ のファイルと、接尾辞が .cgi のファイルをCGIスク リプトとして実行する場合は以下のようにします。CGIは、ゲートウェイイ ンタフェースの一種です。ここで言うゲートウェイとは、HTTPを介して起 動されるプログラムのことです。CGIはゲートウェイにデータを渡す手段と してオペレーティングシステムの環境変数を利用する規格です。なお、接 頭辞は必ず / で終る必要があり、接頭辞で指定されたディレクトリ以下の リソースは全てCGIスクリプトとして解釈されます。 tommygun -gate .cgi -gate /cgi-bin/ 通常は、ゲートウェイプログラムの出力はサーバによってヘッダを解析さ れ、HTTPとしての整合性が保証されます。その解析をせずにゲートウェイ の出力をそのままクライアントに送信したい場合は以下のようにします。 tommygun -gate .cgi -gate /cgi-bin/ -rg HTTPの基本認証を要求し、ユーザ名 mikio かつパスワード abc のアカウ ントとユーザ名 jiro かつパスワード 123 のアカウントを設定する場合は 以下のようにします。基本認証とは、HTTPの接続の際に特定のユーザ名と パスワードを指定することを必要とし、そうでない場合に接続を拒絶する 仕組みです。 tommygun -auth mikio:abc -auth jiro:123 リモートプロクシに proxy.mikio.gov のポート 3128 番を用いる場合は以 下のようにします。リモートプロクシとは、このサーバがプロクシとして 機能する際に、さらにそのプロクシとして動作するサーバのことです。な お、このサーバのプロクシ機能は透過的であり、ヘッダの追加や隠蔽や加 工を一切行いません。キャッシングも行いません。 tommygun -rhost proxy.mikio.gov -rport 3128 プロクシとしての利用を禁止したい場合は、以下のようにします。 tommygun -np アクセス数が多くて処理が重くなるような時は、クライアントから接続を 待機するプロセスの数を増やすことによって応答を高速化することができ ます。以下のように起動すると5つのプロセスを待機させます。 tommygun -part 5 PUTおよびDELETEメソッドを有効にする場合は以下のようにします。PUTメ ソッドはクライアントが送信したデータをURIで指定するリソースとしてサ ーバ上に保存するものです。PUTメソッドで指定されるURIの末尾が / の場 合は、ディレクトリが作成されます。そうでない場合でも、URIで指定され るサーバ上のパス上のディレクトリが存在しない場合は、URIのファイルを 作成するのに必要なディレクトリを作成します。DELETEメソッドはURIで指 定されるサーバ上のリソースを削除するものです。DELETEメソッドで指定 されるURIの末尾が / の場合はそのディレクトリを削除します。ディレク トリを削除する際は、そのディレクトリが空である必要があります。 tommygun -put -del レスポンスにヘッダを追加したい場合は、以下のようにします。 tommygun -addh 'Via: 1.0 santiago' アクセスログを記録したい時は、ログファイルを指定します。デフォルト では、接続したクライアントのIPアドレス、リクエストの冒頭部分、接続 した時刻、レスポンスのステータスコードが各行に書き込まれます。ログ を冗長化すると、エンティティボディも含めたクライアントから受信した 全てのデータを記録します。 tommygun -log /tmp/wwwlog -v 通常のログは、各接続を各行に記述する形式です。クライアントのIPアド レス、リクエストの冒頭、接続日時、レスポンスのステータスコードをタ ブで区切って並べます。冗長化したログの形式では、ファイルの最初にサ ーバの設定情報を出力し、その後に各接続のリクエスト内容を完全に記述 します。各リクエスト内容の前には、それを処理したサーバのプロセスID と、そのプロセスでの処理番号と、クライアントのIPアドレスと、レスポ ンスのステータスコードの情報を持つ1行が付加されます。 このサーバはCGI以外のゲートウェイインタフェースも持っています。この 機能は、環境変数が取得できないJavaなどの環境をゲートウェイとして用 いたいときに利用する価値があります。ハンドラは特定の接尾辞に関連付 けられます。ハンドラは空白文字で区切られるコマンドラインです。区切 られた後のトークンはプログラムの引数となり、第1トークンは起動する プログラム名としてオペレーティングシステムに渡されます。実際に起動 するプログラムは PATH 環境変数に基づいて探されます。トークン中には 置換表現を用いることができ、それによって処理対象のリソース名やクラ イアントが送信したデータを指定することができます。また、CGIと同じ環 境変数が定義され、クライアントが送信したエンティティボディは標準入 力から受け取ることができます。置換表現には以下のものがあります。さ らに、C言語の文字置換と同じ様に \t \v \n \r \f \\ を用いることがで きます。なお、ハンドラもCGIの指定と同様に接頭辞(ディレクトリ)で指 定することができますが、その場合はファイル名に現れるの最後のピリオ ド以降の文字列が接尾辞になります。 {FILE} リソースのファイル名。 {CORE} リソースのファイル名から接尾辞を削除したもの。 {PATH} リソースのファイルシステム上での絶対パス。 {URI} リクエストのURIそのもの。 {METHOD} リクエストメソッドの名前。 {QSTR} クエリーストリング。未定義の場合は空文字列。 {PINFO} 追加パス情報。未定義の場合は空文字列。 {CLEN} Content-Length ヘッダの値。未定義の場合は空文字列。 {CTYPE} Content-Type ヘッダの値。未定義の場合は空文字列。 {SPC} スペース文字。 例えば、Java プログラムをCGIに似たインタフェースで利用する場合は、 以下のようにします。 tommygun -hand .jgi "java -jar -DREQUEST_METHOD={METHOD} \ -DQUERY_STRING={QSTR} -DPATH_INFO={PINFO} \ -DCONTENT_LENGTH={CLEN} -DCONTENT_TYPE={CTYPE} {FILE}" あるいは、接尾辞が .shtml のHTMLファイルを解析してその一部を特定の コマンドの出力で置き換える、いわゆるサーバサイドインクルード機能を ハンドラで実装することもできます。それには、HTMLのメディアタイプ指 定を出力し、続いて第1引数で指定されるファイルを解析し、一部を置換 しながらHTMLとして出力するスクリプトを用意しておきます。このスクリ プトは htssi としてこのディレクトリに収録されています。あるいは、 HTMLをgzipで圧縮して接尾辞が .html.gz のファイルを作っておき、それ が要求されるたびにzcat で展開してクライアントに送信することもできま す。このスクリプトは htzcat としてこのディレクトリに付録されていま す。これらのスクリプトと接尾辞を関連づけるには、スクリプトをパスの 通ったディレクトリにインストールした上で、以下のようにします。 tommygun -hand .shtml "htssi {FILE}" \ -hand .html.gz "htzcat {FILE}" ハンドラは接尾辞に対してだけでなく、メソッドオーバーライド機能によ って特定のメソッドに対しても対応づけることもできます。例えばGETを オーバーライドした場合は、全てのGETメソッドはそこで対応づけられた ハンドラによって処理されます。あるいは全く別のメソッドを定義するこ ともでき、それによってHTTPの機能を拡張することができます。メソッド のハンドラは通常のハンドラと同様のコマンドラインで処理されますが、 使用できる置換表現は {URI} {CLEN} {CTYPE} {SPC} とC言語風の文字置 換のみです。また、クエリーのURIはリソースとして存在するかチェック されません。カレントディレクトリはドキュメントルートになります。メ ソッドのハンドラは非解析ヘッダスクリプトとして実行され、出力は解析 されずにそのままクライアントに渡されます。環境変数についてはCGIや 通常のハンドラと同じように使用できます。 このディレクトリには、メソッドのハンドラを用いてLISTメソッドとMOVE メソッドの2つを実装したプログラムが付録されています。LISTは特定の リソースに従属するURIのリストを出力するもので、MOVEはリソースを移 動させて別のURIを割り当てるものです。詳しい内容についてはソースフ ァイルを見てください。この2つのゲートウェイプログラムをそれぞれの メソッドに対応づけるには、以下のようにします。なお、PUTとDELETEに 加えてMOVEメソッドを有効にすると、Netscape Navigatorのローミングア クセスサーバとして機能させることができます。 tommygun -over LIST rglist -over MOVE rgmove このサーバをプロクシとしてのみ動作させたい場合は、エラーコードを返 すダミーのゲートウェイを用意して、全てのメソッドをそれでオーバーラ イドしてください。例えば、503 エラーを出力する付録のプログラムを用 いて以下のように設定できます。 tommygun -over GET rgdeny -over HEAD rgdeny \ -over POST rgdeny -over PUT rgdeny -over DELETE rgdeny このサーバ自体や、ゲートウェイのデバッグを行いたい場合は、以下のよ うにしてデバッグモードでサーバを起動すると便利です。デバッグモード では、サーバプロセスがデーモンにならずに端末に結び付いて実行され、 サーバやゲートウェイのエラーメッセージを確認することができます。 tommygun -debug ドキュメントルートおよび基本認証に関しては、環境変数を使って設定す ることもできます。環境変数 TGROOT が定義されている場合、その値をド キュメントルートに設定しようとします。ただし引数でもドキュメントル ートが指定されている場合は引数の方を優先します。環境変数 TGAUTH が 定義されている場合、その値から基本認証文字列を生成します。書式は、 ユーザ名とパスワードをコロンで区切った表現を、カンマで区切って列挙 したものです。引数でも基本認証文字列が指定された場合は、環境変数と 引数の両方が基本認証文字列に設定されます。例えば、以下のように設定 します。 export TGROOT=/home/www export TGAUTH=mikio:abc,jiro:123 tommygun このように、tommygun のオプションは沢山ありますから、起動スクリプ トを作成しておくと便利です。このディレクトリに収録された tgstart は対話的に起動オプションを指定できます。Javaおよびgzのハンドラと非 常に多くのメディアタイプが設定されます。このスクリプトを参考に起動 スクリプトを自作すると便利です。 シェルでCGI等のゲートウェイプログラムを作成する際には、HTMLの入力 フォームによって送信される application/x-www-form-urlencoded 形式 のデータから特定のパラメータを抽出する処理を行うのに苦労します。そ この場合、このディレクトリに収録された fdec を使うと便利です。詳し くはソースコードのコメントを読んでください。 ☆注意事項 用心してください。コマンドラインからこのサーバを起動した場合、当然 ながら、プログラムはあなたが実行するプロセスとして動作します。です から、ドキュメントルートディレクトリ以下にあって、あなたが読むこと のできるファイルは、全て公開されることになります。また、このサーバ から起動されるゲートウェイもあなたのプロセスとして動作します。した がって、ゲートウェイのバグやセキュリティホールは深刻な被害をもたら す可能性があります。サーバプログラムの所有者を nobody 等、ログイン シェルのないユーザにし、setuidビットを立てることによって、この問題 はある程度回避できます。 基本認証はパスワードがネットワーク上を暗号化されずに流れるという問 題があるため、セキュリティが不十分だと言わざるを得ません。また、同 じホストのユーザは、ps コマンド等でこのサーバを起動したコマンドライ ンを見ることができます。-auth オプションとその引数も例外ではありま せん。少しでもセキュリティを高めるために、基本認証の設定には環境変 数を使うことを強く推奨します。 PUTメソッドとDELETEメソッドは非常に危険です。ドキュメントルートディ レクトリ以下の全てのファイルを書き換えたり消したりできるからです。 これらのメソッドを許可する場合、ユーザに対する基本認証を必ず行うべ きです。とはいえ、基本認証の潜在的な問題により、インターネット等で 不特定多数のユーザに対するWebサービスを行うならば、PUTとDELETEの使 用は制限する方がいいでしょう。 バインドするアドレスおよびポート番号をリモートプロクシのそれらと同 じにすると、要求がループして大変なことになってしまうので、気を付け てください。 ☆最後に このプログラムは平林幹雄 が作成しました。バグレ ポートや改良案など歓迎します。また、GPL2に基づいて配布するので自由 に使用、変更、再配布を行って構いません。 Version: 3.5.4 Last Modified: Sun, 23 Sep 2001 03:45:46 +0900 ===================================================================