[8] PSGI は、 Perl における HTTPサーバーと Webアプリケーションとのインターフェイスの仕様です。 2009年に Tatsuhiko Miyagawa らにより制定、実装されました。
[9] WSGI に強い影響を受けており、これを Perl に移植したものとなっています。
[10] 現在では多くの Perl の HTTPサーバーや Webアプリケーションが対応しています。
[11] 環境は、 CGI のメタ変数の流れを汲むハッシュ参照で、 HTTPサーバーから Webアプリケーションへの伝達に使われます。
[12] サーバーとアプリケーションの責務が明確に定められていません。例えば、 ヘッダー値に不適切な改行が含まれると HTTPメッセージとして正しく解釈できなくなり、 ときにセキュリティーの問題を引き起こすことがありますが、 これをどちらが保証するべきなのか、サーバーだとしたらどのように処理するべきなのか (黙って訂正するべきなのか、何らかの方法でエラーとするべきなのか) がはっきりしていません。
[13] HTTP の機能のうち、 理由句には対応していません。 CGI その他の既存の手法に対する明白な欠点です。
[14] WebSocket を扱うことができません。いくつかの実装は ad hoc な対応をしていますが、標準化されていない (可搬性がない) だけでなく、 技術的に美しくない強引な方法を採っています。
[15] server push を扱うことができません。
[17] 要求の受信中にクライアントとの接続が切断された場合や、 長い処理の途中でサーバーが再起動されようとしている時など、 中断した方が良いかもしれない場合にその旨をサーバーからアプリケーションに伝達する手段がありません。
.psgi
ファイル[19] PSGIアプリケーションを返す Perlスクリプトを拡張子が .psgi
のファイル >>25 とすることがよくあるようです。PSGI を実装したサーバーは、
指定されたファイルを do
などによって読み込み、
得られたコード参照をアプリケーションとして実行することが期待されています。
[28] PSGI の開発者らによる Plack が日本では広く用いられています。 Starlet や Twiggy のような主要な PSGI 対応Webサーバーや、 各種 WAF が Plack を利用しており、一般の開発者が PSGI と Plack を混同する元凶となっています。
[30] 実際には Plack を使わない PSGI もいくつか存在し、使われています。
[31] ただしミドルウェアは、それ自体は PSGI で規定された概念ですが、実装上は
Plack を使い Plack::Middleware
という名前を翳したものが多いです。
それらが Plack 以外の PSGI の実装と現実的に共存できるのかは不明瞭です。
[29] Perl5 とは似て非なる言語 Perl6 向けには、 P6W という似て非なる API があります。当初は P6SGI と呼ばれ、 PSGI の影響を強く受けていました。現在も PSGI Protocol という動作モードが API の一部を構成していますが、類似性は薄まっています。 PSGI が扱えない WebSocket への対応や、 HTTP/2 の扱いの規定もあります。 仕様書としては PSGI よりも厳密に記述されています。
[1] PSGI 計画についてのおしらせ。for Japanese Perl Mongers - TokuLog 改めB日記 ( 版) http://d.hatena.ne.jp/tokuhirom/20090904/1252091316
[2] PSGI updates: Specs and more reference implementations - bulknews.typepad.com ( 版) http://bulknews.typepad.com/blog/2009/09/psgi-updates-specs-and-more-reference-implementations.html
[3] PSGI - Perl WSGI - bulknews.typepad.com ( 版) http://bulknews.typepad.com/blog/2009/09/psgi-perl-wsgi.html
[5] Feersum - search.cpan.org ( ( 版)) http://search.cpan.org/dist/Feersum/lib/Feersum.pm#PSGI_extensions
[22] plack/psgi-specs: PSGI (Perl WSGI) specifications () https://github.com/plack/psgi-specs
[24] Plack/Lint.pm at master · plack/Plack () https://github.com/plack/Plack/blob/master/lib/Plack/Middleware/Lint.pm
[27] psgi-specs/FAQ.pod at master · plack/psgi-specs () https://github.com/plack/psgi-specs/blob/master/PSGI/FAQ.pod