PSGI/Plackに挑戦

CGI/FastCGIの仕組みがわかり、ようやくPlackにチャレンジ。

インストール

これでPlack関連のモジュールをまとめてinstallできる。

cpanm Task::Plack

Hello PSGI!

まずはPSGIの基本形をやろう、ということで以下のコードリファレンスをhello.psgiとして保存。

use strict;
my $app = sub {
    my $env = shift;
    return [
        200,
        [ 'Content-Type' => 'text/plain' ],
        [ "Hello PSGI!" ],
        ];
};

これをplackupすると、PSGIアプリケーションが起動する。HTTPサーバは指定してないのでHTTP::Server::PSGIが自動的に選ばれた。

kotaro@mdev1:~> plackup psgi/hello.psgi 
HTTP::Server::PSGI: Accepting connections at http://0:5000/

http://localhost:5050/にアクセスすると、「Hello PSGI!」と表示される

Hello PSGI with FastCGI

今度はFastCGIをサーバにして、PSGIアプリを動かしてみる。
FastCGIはExternalにし、Unixドメインソケットを通して、PSGIアプリとやり取りする。

FastCgiExternalServer /var/www/html/hello.fcgi -socket hello.sock
  • plackup
kotaro@mdev1:~> plackup -s FCGI --listen /var/log/httpd/fastcgi/hello.sock psgi/hello.psgi


Unixドメインソケットがlistenになってるか調べると、確かにlistenステータス。

kotaro@mdev1:~> netstat --unix -l | grep hello.sock
unix  2      [ ACC ]     STREAM     LISTENING     111707 /var/log/httpd/fastcgi/hello.sock

この状態で、http://localhost/hello.fcgi/にアクセスすれば、「Hello PSGI!」と表示された。
一度理解すれば大したことじゃないけど、辿り着くにはだいぶ時間かかりました。。

サーバプロセス数を増やす

Plack::Handler::FCGIのSYNOPSISみてたら、--nprocオプションが使えるみたい

kotaro@mdev1:~> plackup -s FCGI --listen /var/log/httpd/fastcgi/hello.sock psgi/hello.psgi --nproc 5
FastCGI: manager (pid 13481): initialized
FastCGI: server (pid 13482): initialized
FastCGI: manager (pid 13481): server (pid 13482) started
FastCGI: server (pid 13483): initialized
FastCGI: manager (pid 13481): server (pid 13483) started
FastCGI: server (pid 13484): initialized
FastCGI: manager (pid 13481): server (pid 13484) started
FastCGI: manager (pid 13481): server (pid 13485) started
FastCGI: server (pid 13485): initialized
FastCGI: server (pid 13486): initialized
FastCGI: manager (pid 13481): server (pid 13486) started

Starmanにサーバを切替える

あっけないほど簡単。PSGIという共通仕様のメリットを実感。

starman --port 8080 psgi/hello.psgi
# or this
plackup -s Starman --port 8080 psgi/hello.psgi