解説: シルクな蜘蛛の巣

WWW server "SilkWeb" page (補足のページ(?))

[ もどる ]


このページでは 〆(^^) 作の WWW server SilkWebの解説を行っています。
付属ドキュメントの改訂版といってもいいっしょ。
このページで(にかぎらず)分かりにくい場合は 連絡下さい

で, ダウンロードはこちらからどーぞ関係のページもあります

でもまあ, これって多くの人には関係のない話だろうけどね (T_T
だいたい WWW server なんか立ち上げる人ってそんなにいるもんじゃない。 ましてや, 他のサーバーの方が高速なうえ機能も高いし, その上安定性もばっちり ・・・バッチソって書いたら今風なんかな (^^)\(バキ☆)
これを動かす目的は動作を知る事だと思えば, 多少のアレには目をつぶって … (←アレって?)

このページのイメージは ハエ取り草, じゃなくって えーと, 女郎蜘蛛です。


SilkWeb ドキュメント (あるいは補足)




エラーのページ

例えば, Webブラウザから存在しないページをアクセスされた場合, Webサーバーはコード 404と 少しばかりのメッセージを返します。
少し親切なサーバーは, ヒントとしてどこかへのリンクを出す場合もあります。 また, Webブラウザでアクセスしている人を不安がらせないようにするためか, アニメーション画像と共に親切丁寧に その状態を知らせるのもあります。

SilkWebでは, エラーメッセージを生成する部分を別に用意することで, そうした用途に対応できます。もちろんアニメーション画像を用意すればそれを表示できます。

プログラム名は SlkErr.cmdです。このプログラムが存在しない場合, エラーメッセージは質素なものになります。

このままではあまり意味がありませんが, これを見栄えよく変更することで, そのサイトに合った雰囲気の画面を作り出す事ができます。
エラーを起こさないと見る事はできませんが・・

作成したプログラムは, SilkWeb のシステムと同じ場所に置いておくとよいでしょう。 そこに存在すれば, 自動的に呼び出されます。


サンプル CGIの使い方

SlikWeb には, 現在(Ver 1.3)のところ 2つのサンプル CGIがあります。 この使い方を少しばかり説明します。
準備としては, まず SilkWebサーバーを立ちあげておきます。


CGI 機能

CGIのプログラムを動かす場合, いくつかの方法があります。

などです。 いずれにしても, サーバーの 割り当て定義ファイルで CGIである事を指定しておきます。
また, SlikWebでは CGIプログラムは Rexxで作る事になります。これは CGIプログラムからの結果を取り出す方法がないためです。
以下に, CGIプログラムでの入出力の方法を示します。

まずは, 入力側。CGIプログラムは次の方法で情報を得る事ができます。

  1. 環境変数
  2. 引数
  3. ソケットを使った通信

[1] 環境変数

基本的に, 情報は環境変数によって渡されます。 以下のような種類のものがあります。
環境変数内容
REQUEST_METHOD GET によるものか POST によるものかということ。どちらかの文字列が入っている。
SCRIPT_NAME 例えば次のようなもの /cgi/web-bbs.cmd
SERVER_SOFTWARE サーバー名。'SilkWeb(RxHTTPd)/1.2' が入る。'/' の後はバージョンなので変化するかもしれない。
SERVER_PROTOCOL 'HTTP/1.0'
SERVER_ADDR 接続を受けた IP アドレス (例えば '127.0.0.1' など)
SERVER_PORT 通常は 80。ただし設定にもよる。
REMOTE_ADDR 接続してきたクライアントの IP アドレス
PATH_INFO 例えば cgi/a/b/c の時の "/a/b/c"
PATH_TRANSLATED PATH_INFOの前に 構成ファイルの WWWrootをつけたもの
QUERY_STRING 要求行の '?'以降の文字列 (エンコードされている)。POST の場合は, ここではない。
HTTP_USER_AGENT 要求ヘッダーの 'User-Agent:' (例えば 'Mozilla/3.14 [ja] (OS/2; I)')
HTTP_ACCEPT 要求ヘッダーの 'Accept:' (例えば 'image/gif, image/jpeg, */*')
HTTP_REFERER 要求ヘッダーの 'Referer:' (どこからたどってきたかを表す)
CONTENT_TYPE 要求ヘッダーの 'Content-Type:' (例えば 'application/x-www-form-urlencoded')
CONTENT_LENGTH 要求ヘッダーの 'Content-Length:'

[2] 引数

SilkWeb の設定環境や, POSTメソッド時の情報の一部は, 引数によって渡されます。
最初の引数は, SilkWeb の設定環境で, キーワード 内容 [キーワード 内容 ...] という具合に並んでいます。
(現時点での)キーワードは次の通り。
WWWroot 同名の 構成ファイルの項目
WelPage 同名の 構成ファイルの項目
ServName環境変数の SERVER_SOFTWAREと同じ内容
ProtoVer環境変数の SERVER_PROTOCOLと同じ内容
sk この要求で使用しているソケットの番号
その次の引数は, POSTメソッド時の情報の一部です。 エンコードされたままになっているので, 場合によってはデコードが必要。 通常は, これだけで処理可能ですが, multipart での POSTの場合, 後に述べる方法で続きを読み込む必要があります。
※ GETメソッドでの場合は, 情報はここではなく, 上記の QUERY_STRINGに入っている。

[3] ソケットを使った通信

multipart での POSTの場合, 引数には情報の一部しか現れません。 この場合, 続きを CGIの中で読みだす事が必要になります。
※ この機能は version 1.3 以降でサポートされます。 このようにして読み込む事ができます。 ここで使用しているサブルーチンはサンプルCGIプログラムにも含まれているもの。 結果は, (ここでは) PostData に入ります。


では, 次に出力側。一般的な CGIとは異なり, SilkWebでは CGIプログラムの出力は queueで行います。 このため出力に先だって, 内容を組み立てておかなくてはなりません。
また, この時 応答ヘッダーを指定する事ができます。queue <応答ヘッダー>; queue <結果>; の順番で指定します。指定する順番を逆にしたい場合は pushを使います。


応答ヘッダー

クライアントから要求があったものを送り返す時に, サーバーは次のものを返します。

この, 応答ヘッダーで返される値には, 送り返すデータのさまざまな情報が含まれます。 (もちろん, それ以外のものも含まれます)
これらの情報(応答ヘッダー)は, 要求ヘッダーと同じような構造をしています。(SMTPなどとも同じです) これ以外にも, (ファイルが無いなどの)エラー時の, キャッシュの制御などがあります。

上の図の中に, 最終更新日付とファイルサイズが含まれています。 Webブラウザを使って同じ画面を複数回見る時に, 2度目以降はブラウザのキャッシュが使われる場合がありますが, その判断基準となっている情報です (送り出す判断を行うのはサーバーです)。 また, Web siteの更新チェックプログラムも, 大抵これを利用しています。

通常, これらはサーバーが生成するものですが, それを変更したい場合があります。 たとえば SSIの場合, 最終更新日とは その日, その時間になってしまい, オリジナルファイルの更新日付とは違ったものになります。(CGIも同様ですが, オリジナルファイルという意味で多少異なります (^^;)
他に, クッキー(Cookie: , Set-Cookie)を返す事にも関係があります。

これらをブラウザに返すには, HTMLファイルの headタグの間にそれらを指定します。

図では, 最終更新日を指定するとともに, クッキーで listcountに 5を, 西暦 2000年 1月 1日までの期限で, ブラウザに記憶させようとしています。

しかし, この記述を行ってもブラウザが認識してくれるとは限りません。 つまり, HTMLには メタ情報を埋め込むための拡張機能があるが, それがどのように扱われるかは サーバー, およびクライアント(Webブラウザ)次第ということです。(RFC1866J より)
(N.N. は, クッキーは認識しました。他は試していません (^^;)

この SilkWebサーバーでは, SSIに限り HTMLファイルからメタ情報を取り出し, 応答ヘッダーとして返す事ができます。
ですが, デフォルトではその機能は働かないようにしています。 (つまり, いまのところブラウザ任せになっています)


マッピング

クライアントからの要求パス[5]を, サーバーの実際のパスへ割り当てるために, 割り当て定義ファイルが用いられます。 このファイルは, このほか各種の機能の割り当てにも使われます。
このファイルも 構成ファイル同様(書式は違う) テキストファイルなのでエディターで編集できます。 が, 専用の編集プログラムも付属していますので通常はそちらを使った方が編集が楽でしょう。
通常, ファイル名は SilkWeb.map。このファイル名は, 構成ファイル(SilkWeb.cnf)によって指定します。
以下, この割り当て定義ファイルの事を mapファイルとします。

mapファイルは構成ファイルと異なり, SilkWeb サーバー稼働中でも編集が可能。 設定を変更した場合でも, 再立ち上げの必要はありません。(自動ローディングされる)
指定された内容は, クライアントからの要求があった時に, 先頭から順に一行ずつスキャンされ, 該当する行が見つかった時点でスキャンは終了し その行の定義によって処理が行われます。
ただし, その行に機能が指定されていなかった場合, スキャンは続行。この時, 要求パスはその指定により割り当てが変更されます。

mapファイルの行の形式は, 次の通り。

    'テンプレート'   機能   '割り当てパス'   [サーバーのIPアドレス]
行頭の文字が, 各項目を分けるデリミタにもなっているため, 各項目を "/ などで区切る事もできます。 ただし #; はコメントとして用いるので, これに使う事はできません。
また, 特殊な例として #- があり, 機能の一時停止を意味します。

それでは, 各項目を順に説明します。

◇テンプレート:
クライアントからの要求パスと比較される部分。 テンプレートの文字列の中に *1つ指定でき, この文字を含んだ場合, この部分は 0個以上の文字にヒットする。 その文字を含まない指定の場合は完全に一致する必要がある。 また, テンプレートは大文字/小文字の区別はない。
ディレクトリ指定のワイルドカードと違い '/'を含む部分にもヒットする事もある。
◇機能:
次のような種類の機能があり, 組み合わせて指定できるものもある。 これらの指定には, 先頭の大文字の部分 1文字だけを指定しても構わない。

Mapは 通常のページの場合に指定します。
Redirectは 別のページへ, あるいは別のホストへ飛びます。割り当てパスには飛び先を指定。
Failはアクセス禁止の指定です。クライアントにはファイルが存在しないように見えます。 割り当てパスは指定しない。
Execは これが CGIであることを指定します。 SSiSSIの指定です。
Listdirは ディレクトリの一覧表示可能の指定。ただし表示を行うモジュールがサーバーに必要。
Authorizeは 認証を行う事を指定。機能名と同時に regionを指定する。これは ()でくくる。
(指定なし) 次の定義行へスキップ(パス変更は行われる)

◇割り当てパス:
要求パスをどう加工するかを指定する。 なにも指定がない場合, または * のみの場合は, 要求パスをそのまま使う。Redirectの場合は必須。 一部に * があれば, 要求パスの '*' に相当する部分に置き換えられる。 ただし 先頭が * の場合は, 前の部分が省略されたとみなす。* がなく, 最後が / なら後の部分の省略。

とても複雑そうですが, 例を見るとそうでもないと思います。
割り当てパスでの変換例
テンプレート割り当てパス説明
/cgi-bin/*.cgi /cgi-bin/*.cmd 拡張子の変換
/cgi-bin/* /cgi-bin/*.cmd 拡張子の補完
/admin/icon/*.htm *.html 前の部分省略, '/admin〜' とみなす
/secret/*.txt /html/secret/ 後の部分省略, 最後が '/'なら '/*.txt'とみなす
/secret/*.txt /html/secret/* これは, 拡張子を取り除く事になる
/secret/ /html/secret/ ...
/html/ /html/Index.htm ...
/html/* /html/Readme すべてをここへ集める
/html/ /html/*.htm /html/.htm ... 意味なし

◇サーバーのIPアドレス:
サーバーに複数のネットワークカードがある場合に, 要求を それぞれ別の位置に割り当てたい時に使う。
あるいは, そのサーバーマシン自身からの要求か 別のマシンからの要求かで処理を分ける時にも使う事ができる。 この項目は省略可能。

以上が mapファイルの行です。
さらに, 要求パスが いずれかの行にヒットして, それが変更された後, 条件によっては処理が加えられます。 それは 構成ファイルの WPageセクションの部分で,

ただし WelPageは Listdirの指定の有無と, そのモジュールの有無とで 条件が変わります。

制限


カスタマイズ

SilkWeb サーバーは, 構成ファイル(SilkWeb.cnf)を書替えることで, ある程度 動作を変更させる事ができます。 このファイルは 単純なテキストファイルですのでエディターなどで 編集できます。(専用の編集プログラムも付属していますので使いやすい方を選択して下さい)
構成ファイルには 現在 3つのセクションがあります。

HTTP
… プロトコルに関する部分
JLog
… アクセス記録に関する部分
WPage
… Web pageの指定に関する部分

まずは HTTPセクションから。HTTPセクションには 次のような項目があります。

すこし項目がネストしていますが, 順番にいきましょう。 NumListenとは, listen() の引数 backlog に指定する値。 この値が少ないと, サーバーに一度にたくさんの要求があった時に, 受付ける事ができなくなります。 が, そう気にする必要はありません。デフォルトのままでよいでしょう。

SelWtTimeは, select() のタイムアウトの引数に指定する値。 (送)受信の最大待ち時間というようなもの。単位は秒数。 長くても大丈夫です。5分(=300) とか 一時間(=3600)とかでも構いません。長い方がシステムに負担を掛けないはずです。

MaxRecvLn。これは recv() の引数の長さの指定。最大受信長さ。 1500〜2000 くらいのが指定されていれば変更する必要はないでしょう。

MaxSendLnは, 内部で使う値です。 クライアントからの要求を並行で対応するために, 送り出す情報の長さを制限するもの。

Portは, このサーバーが待ち受けるポート番号。 HTTPでは 80です。


次に JLogセクション。ここには次のような項目があります。

LogFileは アクセス記録のファイル名。 テキスト形式で 追記型(?)です。 拡張子を数字に変更したファイル名で, そのバックアップが作られる事になります。

LogLmtはアクセス記録の限界サイズ。この値を超えた場合, アクセス記録は 次の世代のファイルに変更されます。

LogMaxはアクセス記録のバックアップの数。世代数(?)


最後は WPageセクション。ここには次のような項目があります。

WWWrootは HTMLファイルや, 画像ファイルなど これらを扱うベースのディレクトリを指定します。

WelPageはwelcome page のファイル名。 URLにパス名だけを指定した場合, サーバーがファイル名を補完することになりますが, この時のファイル名です。

MapFile割り当て定義ファイルのファイル名。 このセクションには関係がないような項目 (^^;


この 構成ファイル(SilkWeb.cnf)は, 起動時に一度読み込まれるだけなので, 修正を行った場合 いったん Web server を止め, 再起動の必要があります。


RxSock 外部関数パッケージ

RxSock 外部関数パッケージには, ある重大な問題があります。 といっても, システムをダウンさせたりするものではありません。 このパッケージを使用したプログラムが, それを起動したコマンド窓もろとも落ちてしまう, というものです。 この現象は, RxSockによって一度に複数のソケットを使っている状態で発生するようです。
もちろん SilkWebも例外ではなく, 複数のブラウザ(というかクライアント)から 同時にアクセスがあると異常終了する事があります。

これを防ぐには, Hobbesの RxSock を使うという手段があります。〆(^^) の所では 今のところ問題は起きていないようです。 ただし, こちらは OS/2標準のものと比べ, 一部関数が足りないようです。 判っている範囲では次のようなものです。

追記
Warp ver 4.5なら大丈夫かも知れません。今のとこ正常に動いています。


SSI 機能

SSI は Webブラウザから要求を受けたサーバーが, ファイルを送り出す時点で, 内容を書替えながら送り出す機能です。 SilkWeb でのそれは 割り当て定義ファイルで, SSI の指定があると機能します。 その指定された HTMLファイルは, ブラウザから要求された時に, 通常とは異なる方法で送り出される事になります。

SSIとして扱う HTMLファイルは, 内容も通常のものと微妙に異なります。 SSI対応ファイルを 通常のHTMLファイルのように割り当てると, 少し変な内容がブラウザに表示される事になります。 また, 通常の HTMLファイルを SSIに割り当ててもあまりメリットはありません。

SSI対応ファイルには SSIコマンドを記述できます。 SSIコマンドは "{" と "}" で囲んで指定します。 この SSIコマンドには次のようなものがあります。

例: [1]

"関数"には Rexx の標準の関数や, ほかに次のような関数を指定できます。

変数の中には, 最初から使われている変数(予約変数)があります。 次の変数です。

このように→ <title>{?CURFILE}</title> 指定します (大文字で指定して下さい)。

脚注:

[1]
{?VAR} での変数の展開について … 展開される変数は, 直接の Rexxの変数ではありません。 stem vの tailとして扱っています。
[2]
FileDate() では タイムゾーンは "GMT" になります。 しかし変換されている訳ではなく, タイムゾーンの項目が "GMT"となっているだけです。
[3]
StdFullDate() では 時刻やタイムゾーンの項目はありません。
[4]
"JST"にしていないのは, ブラウザからの要求時に "JST"→"GMT" のように変換されて要求されるためです。
[5]
代表的なものは, http://ホスト名 の後に続く /で始まる一連の文字列

[ もどる ]
email: ori@drive.co.jp