Oneman – A simple web application framework with PSGI server

Windowsでも動作するpreforking PSGI server「Oneman」を作ってみました。5.8.1以上のコアモジュールのみで動作する1ファイル構成のPerlモジュールです。つまり、1ファイル置くだけで動くPSGIサーバです。

HTTP/1.1の一部(Chunked Transfer Coding、Persistent ConnectionsいわゆるKeep-Alive、他)に対応していて、Plack::Test::SuiteをPASSしています。preforkingなマルチプロセスサーバなので、ブロッキングが発生するリクエストの処理中にも別のリクエストを受け付ける事ができます。

使い方

「oneman()」という関数を実行する事でOneman PSGIサーバが動作します。oneman()を実行するスクリプトのコマンド引数にPSGIファイルを指定すると、デフォルトのパラメータでPSGIサーバが起動します。

>perl -MOneman -e oneman mywebapp.psgi
Oneman: accepting connections at http://0.0.0.0:5000/

詳しい使い方はドキュメントをご覧ください。

作成の目的と経緯

Oneman PSGIサーバは、とある方から「ブラウザで動作するターミナルソフトを作って欲しい」という依頼をきっかけに作成しました。

具体的には、Windows PCのシリアルポートに接続されたマイコンから受信したデータを、Ajaxを用いてブラウザに出力する、という動作が要件です。シリアルポートの接続には プロセスを常駐させる必要があり、またデータの受信をAnyEvent等で対応する事が難しくマルチプロセスで処理したかったのですが、そのようなWebサーバモジュールが見つかりませんでした。だからといってApacheを使用するのも大げさなので、要件を満たすサーバを作ってみた、というのが経緯です。昨今の状況に合わせてPSGIサーバとして実装しました。

当初はHTTP/1.0のみに対応した今よりもさらに簡素なサーバでしたが、ブラウザから大量のAjaxリクエストを実行すると数百回~数千回のところでエラーが発生してしまい、その原因・対策も見つけられませんでした。 netstatで確認すると大量のセッションが残っていたため、Keep-Aliveが必要かなと思い、HTTP/1.1に対応させる事にして今の形になっています。

このように単一クライアント向けWindowsソフトウェアへの組み込み用途で作成しており、インターネットに公開する不特定多数クライアント向けサーバとしての使用はあまり想定していません。セキュリティにはある程度気をつけており、Ubuntu、CentOS、Mac OS X等でも正常に動作する事を確認していますが、もしご利用いただく場合はご自身の責任の範囲でお願いいたします。

興味のあった無停止更新のためのプロセス構造等も試してみたり、良い勉強になっています。

web application framework?

実はPSGIサーバは後付けの機能で、Onemanは元々ChatPromptのために作成したCGI/PSGI対応の簡易なWebアプリケーションフレームワークです。Perlコードをそのまま埋め込めるテンプレート機能と基本的なパラメータハンドリングの機能を持っています。

ソース

http://www.tamashiro.org/src/Oneman-0.20/
http://www.tamashiro.org/src/Oneman-0.20.tar.gz