ホーム >> 左脳Script >> linux >> 軽量Webサーバーmattows

軽量Webサーバーmattows


Linuxプログラミングに付いて書いてみたいと思います。

小さな端末のファームに、組込みLinux(uclinux)を使った案件がありました。端末の設定機能を、PCのブラウザからできるようにする方針を取ったのですが、どうやってもファームイメージの容量をオーバーして、きちんと動作させることが出来ませんでした。 幸運にも、作業期間内に解決できた(以前のコンパイル結果がごみとして残ってしまったので、 まっさらな状態からイメージ構築すればよかった)ので、バリデーションの取れた thttpd を選択する事で、事なきを得たのですが・・・

限られた作業期間内で、一つの事に躓いて時間を無駄にできません。(解決してみればたいしたことはなかったが、当時はドツボで煮詰まって先に進めなくなっていた)仕方ないので、問題解決を先送りにするべく、超軽量Webサーバとして mattows を選択したのでした。

mattows

検索で「軽量 Webサーバー」等のキーワードを使用すると、「mattows は600行程度のC言語で書かれた、軽量サーバである。」という要約で書かれています。実際は、HTTP1.0ベースで、GET、HEADメソッドのみの対応、と規模なりの機能ですが。

ここで、「mattows」で検索してみると、"これをベースに小型Webサーバを作った"という技術系ブログの記事も結構あるようです。

ソースコードを入手するも、ドキュメントもなくライセンス形態もわからない(自分の入手経路が悪い?!)状態です。アーカイブには、Makefile と mattows.c のみ。Makefile も特殊な事を特にやっていないので、mattows.c のみでも十分な程です。

ソースコードを見れば、その単純明解さが判ります。プリントアウトしても10ページ程。

きっと誰かが「Linuxの勉強がてら作った習作」が、そのまま超軽量サーバーとして出回ったものでしょう。(と、都合よく解釈しておく)


使用感

実際に(コンパイルして)使ってみると、実行バイナリが x86 で 17kバイト程度、armでも 20k程度(コンパイルオプションやライブラリにも寄るので、大きさはあくまで目安)と、大変小さいです。実際、この大きさのおかげでイメージ容量がほとんど増えなかったので、開発を続行できたのは言うまでもなく。

正直、実行速度は遅いかもしれませんが、よくあるモデムやルーターの設定画面の様な、レスポンスが要求されない用途ならば、十分に実用範囲です。

ただし、そのまま使えるか?と言うと、問題もありました。
  • HTTPのルートがそのままLinuxファイルシステムのルートになる。
  • POSTが使えない。

どちらも、Webページの作成には問題があります。
また、mattows には、要求アクセスがディレクトリであるとディレクトリ一覧を出力する機能があるので、ルートの件と相俟って、そのままでは Linux システムのディレクトリが全てまる見えになってしまうのです。これでは、危なくて使えません。

この他にも「URIの展開が出来ない(してない)」など、使い込める?水準に達していません。


改良

そこで、ひとまずこのルートをなんとかする方向で、改良してみました。

chroot を使ってもよかったのですが、CGI を動かすことを前提とすると問題もあります。
「シンボリックリンク等で公開しているWebルートの外側へのアクセス」や、「CGIがアクセスするファイルのセキュリティ」については、Webサーバの管理範囲外と考える事にしました。「CGIがパスを受け取り処理をする場合、CGI自身が自前で chroot するなりの対策をする。」と言う事です。

実際にやることは単純で、受け取った httpリクエスト のパスから、相対パス「../」「./」の記述を排除する正規化をするだけです。正規化した後、公開するWebルートをくっつけます。このため、mattows の起動オプションにどこをルートにするのかのスイッチを付ける必要もありました。

パスの正規化コード一部。

char *ptr2, *ptr;
/*  相対記述の展開:文字列はASCIIであると仮定   */
for(ptr2=base,ptr=base;;)
{
    if(!strncmp("./",ptr,2))
    {
        strcpy(ptr,ptr+2);
    }
    else if(!strncmp("../",ptr,3))
    {
        strcpy(ptr2,ptr+3);
        ptr2=base,ptr=base; /*  最初から検索  */
    }
    else
    {
        ptr2=ptr;
        if(!(ptr=strchr(ptr,'/')))  break;
        ptr++;
    }
}
/*  ルートからの相対記述を削除 */
if(!strcmp(".",base)||!strcmp("..",base))
{
    base[0]=0;
}
上記のコードは、(char*)base にパスの文字列のポインタを設定する事で、パスの相対記述を正規化します。相対記述の正規化で文字数が増えることは無いので、baseが示すデータを直接書き換えています。

POST は formタグ の method指定 で切替えできるので、とりあえずこの状態で作業を進め、結局設定ページの開発の8割をこの環境で遂行する事が出来てしまったのでした。


ひとまず

いじくっている内に欲が出てきましたよ。
「バイナリーサイズの小ささに拘りつつ、実用レベルに改良できないものだろうか。」
実を言うと thttpd もWebサーバとしては相当小さいのです。それでもバイナリサイズは mattows の3倍くらいはありますが。最終的な水準を thttpd レベルに、バイナリサイズをとにかく小さく出来ないものでしょうか。などと考えています。

何番煎じか判りませんが「mattows をベースに小型Webサーバ」を作って見ようと思いたちました。



トラックバック(0)

トラックバックURL: http://n-yagi.0r2.net/sanoupulurun/mt-tb.cgi/256

コメントする

ホーム >> 左脳Script >> linux >> 軽量Webサーバーmattows

アーカイブ

このブログ記事について

このページは、n-yagiが2010年6月 7日 18:40に書いたブログ記事です。

ひとつ前のブログ記事は「Bindable の仕組み」です。

次のブログ記事は「mattows の POST 対応への道」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。