Archive for the ‘perl’ Category

nginxでFastCGIはplackupでやると超簡単

日曜日, 12月 19th, 2010

ちょっとnginxでFastCGIを使ってみたくなってnginx with fastCGIのドキュメントを読んでみた。
spawn-fcgiを使ってがんばるみたいなドキュメントしかなくてよくわからない。
そういえばplackでできたようなと思ってcpanを調べてみるとそれらしきモジュールがあった。

1. まずはドキュメント通りにnginx設定ファイルを用意。
nginx.conf

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    server {
        location / {
               set $script "";
               set $path_info $uri;
               fastcgi_pass   unix:/tmp/fcgi.sock;
               fastcgi_param  SCRIPT_NAME      $script;
               fastcgi_param  PATH_INFO        $path_info;
               fastcgi_param  QUERY_STRING     $query_string;
               fastcgi_param  REQUEST_METHOD   $request_method;
               fastcgi_param  CONTENT_TYPE     $content_type;
               fastcgi_param  CONTENT_LENGTH   $content_length;
               fastcgi_param  REQUEST_URI      $request_uri;
               fastcgi_param  SEREVR_PROTOCOL  $server_protocol;
               fastcgi_param  REMOTE_ADDR      $remote_addr;
               fastcgi_param  REMOTE_PORT      $remote_port;
               fastcgi_param  SERVER_ADDR      $server_addr;
               fastcgi_param  SERVER_PORT      $server_port;
               fastcgi_param  SERVER_NAME      $server_name;
        }
    }
}

2. FastCGIスクリプトを用意。(ドキュメントのコードにlistenするport or socketと立ち上げるプロセス数をオプションで取れるようにしただけ)
hello.psgi

use strict;
use warnings;
use Getopt::Long;
use Plack::Handler::FCGI;

my $port_or_sock = "/tmp/fcgi.sock";
my $num_proc = 1;
GetOptions("listen=s" => \$port_or_sock,
           "nproc=i" => \$num_proc);

my $app = sub {
    return [ 200,
             ['Content-Type' => 'text/html'],
             ["Hello, World!!!"]
           ];
};

my $server = Plack::Handler::FCGI->new(
      nproc  => $num_proc,
      listen => [ $port_or_sock ],
      detach => 1,
);

$server->run($app);

3. nginxを起動する

$ sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

4. FastCGIスクリプトをplackupで起動する

$ plackup -s FCGI --listen /tmp/fcgi.sock --daemonize \
                --nproc 32 /usr/local/nginx/fcgi/hello.psgi

たったこれだけでhttp://localhost/を見るとHello, World!!!が表示される。
うーむ、FastCGIの知識ゼロでここまで簡単に使えちゃうとはPlack恐るべし。