a. プログラム名 KL1HTTPD b. 処理の概要 HTTP (WWW のプロトコル) のリクエストを解析し、 応答する。apache, CERN などの代表的な HTTP サーバの 代用として使えるよう設計してある。 c. 処理に要する実行時間 HTTP のリクエストの種類によるが、おおむね短い(数秒) ●概要 KL1 で書かれた HTTP サーバ です。 インラインCコードは一切使わない方針をとったので、不完全なところも いろいろとありますが、 apache や CERN のサーバのバックアップぐらいには 使えると思います。 ●コンパイル方法 config.kl1 を環境に合わせて適当に編集した後、 make を実行すれば kl1httpd という名のオブジェクトコードが生成されるはずです。 config.kl1 の編集方法の詳細などは compile.doc を参照して下さい。 ●インストール方法 まずサーバーのルートディレクトリを適当に決めて、コンフィギュレーション ファイルに書き込むか、予め config.kl1 の中で指定しておくかします。これを 以下 サーバールート と呼びます。 kl1httpd は apache などの他のサーバと同様なコンフィギュレーションファイルを 起動時に読み込みます。このファイルは、起動時の -f オプションで指定しなければ、 サーバールート/conf/httpd.conf にあると見なされます。どちらにもない場合は config.kl1 で設定した DefaultServerRoot の下の conf/httpd.conf にあると 見なされます。いずれにせよこのファイルは必須です。デフォルト設定の コンフィギュレーションファイルがこの README と一緒にバンドルされている はずですので、それを適当に編集して(後述のコンフィギュレーションファイル の項を参照) 適当な所 (サーバールート/conf/httpd.conf か、-f で指定しやすい ところ) に置いておきます。 次に、サーバールート/conf/ の下に mime.types をコピーします。これもこの README と一緒にバンドルされているはずです。ここにないタイプの リソースを公開したければ、このファイル中に content-type そのタイプのファイルの持つ拡張子 という書式で設定します。 あとは、kl1httpd 自身を適当な場所に入れておきます。 ●実行方法 起動時のオプションは kl1httpd [KLIC runtime options] [-- [-d ServerRoot] [-f ConfigFile]] となっています。普通のサーバーと違い、端末の切り離しなどはしないので その点注意して下さい。警告などは標準出力に出ますが、あまり役に立つ 情報は出しません。 ●注意点・問題点 このサーバは KL1 言語のみで書かれているので、いくつかの制限・いくつか 注意しなければならない点があります。現在わかっている範囲では ○大きなファイルを送信中に接続が切れると、サーバが落ちる。 理由 : 双方向への通信をしているソケットが、有効か否かの判定が 現在の KLIC では判断しにくいため。うまい解決方法は まだ思いついていない。(select() でも埋め込むしかないのか…) ○同時に接続できるクライアントの数は 15 に制限されている。 理由 : ファイルディスクリプタが足りなくなるため。fork() して複数の プロセスを作ってしのぐのが常道だが、KLIC だと accept() の 同期が難しい。(やればできないことはないだろうが。) ○If-Modified-Since ヘッダがあっても無視してしまう。 理由 : 現在の KLIC ではファイルの修正時刻を直接得る方法がないため。 ○CGI に対応していない。 理由 : 子プロセスの出力を取り込めないため ○ ~user の解析がいい加減 理由 : getpwent などの類の述語がないため。 (NIS のライブラリを直接書くのはさすがに…。) ●その他未実装な部分 ○アクセスログファイルなどは生成しない。 ●セキュリティの問題について もちろん注意してはいます。現状では CGI も無いので大丈夫だろうとは 思いますが、完全だとの保証はできません。(apache や CERN だって…。) よって、このプログラムを使って生じたいかなる障害についても、 作者は責任は負いません。 ---------------------- プログラムについて -------------------------- ●内部構造 モジュール名 役割 main オプションやコンフィギュレーションファイルの解析など dispatch サーバーのメインループ。新しい接続を受けると server を 呼び出す。 server リクエストを解析し、返答する stdutil 各種ユーティリティ的なモジュール。sprintf,sscanf など、 (同名のCの関数に類似のもの) 便利な述語を含む。 env 名前、値の組を保持するためのデータ型を司る。 sockio ソケットを使った入出力用の述語群。あまり有用ではない。 ioutil 入出力一般用の述語群。 date Date ヘッダを作ったり、解析したりするための述語群。 あまり使われていない。 config コンフィギュレーション情報。Cプログラムによくある config.h に相当。 -------------- コンフィギュレーションファイルについて -------------- apache 等のサーバーのファイルに非常によく似ていますが、指定できる 情報の種類がずっと少なく、またいつか特殊なフィールドもあるので、 一通りフィールド名とその意味をリストアップしておきます。 なお、フィールド名には大文字小文字の区別はありません。 Port ポート番号 ServerRoot サーバのコンフィギュレーションファイルなどを置いておく所 DocumentRoot UserHome UserDir 公開されるファイルは、 DocumentRoot の下のファイル群 (http://host/xxx/yyy/zzz -> DocumentRoot/xxx/yyy/zzz) UserHome//UserDir の下のファイル群 (http://host/~xxx/yyy -> UserHome/xxx/UserDir/yyy) のいずれかである。KLIC では ~usernamr を直接展開することが できないので、この奇妙な設定方法をとることになった。 MaxClients 同時に接続できるクライアントの最大数 (今の所 1〜15 のみ指定可) ServerHost サーバの動作しているホストの名前。コンフィギュレーション ファイルか、config.kl1 のどちらかで指定されている必要が ある。(コンフィギュレーションファイルの方が優先。) 必ず世界中からわかる名前にしておくこと。 (http:///... として使われることがある。) DefaultContentType mime.types ファイルからはファイルのタイプがわからなかった時 どのファイルタイプとして送るかの指定。 text/html が普通だが、text/html ; charset=iso-2022-jp などとしてもよい。 ServerName 返答中に現れるこのサーバの種名。 セキュリティを重要視する見地から見れば コメントアウトしておいた方がいいだろう。 ------------------------- その他 ------------------------------ ●作成の動機など 多数のクライアントを同時に捌くのは KL1 なら得意そうだと思い作りました。 確かに書きやすくはあったのですが、やはりソケットを使ったプログラムは Cの方が頑丈にできるようです。できるだけ RFC1945 にある HTTP/1.0 の 情報に沿うようにしようと思ったのですが、例えば .... Both clients and servers should be aware that either party may close the connection prematurely, due to user action, automated time-out, or program failure, and should handle such closing in a predictable fashion. In any case, the closing of the connection by either or both parties always terminates the current request, regardless of its status. というような所をしっかりとおさえることはできませんでした。 インラインCを一切使わなかったのは、KLIC のマニュアルに「一般ユーザは 使用しない方がいい」「将来も同じソースが動くとは限らない」と書かれていた のと、KL1 だけでどこまでできるか確かめたかったからです。もう少し KLIC のライブラリがしっかりしていたら、という気分がやや残りましたが。