« 軽量 Web サーバー | メイン | WebService::TimeLine公開しました »

GearmanとかNginxとか

ひさびさにFemoを弄った。
サーバ周りを中心にいくつか改善

まず、以前FastCGIの環境で動かないと書いたText::VimColorGearmanを使うようにしてみました。
Text::VimColorはText::Hatena(バージョン0.16)の中で使われています

#Worker(worker.pl)

my $worker = Gearman::Worker->new;
$worker->job_servers(qw/127.0.0.1/);

$worker->register_function(
    vimcolor_html => sub {
        my $g = shift;
        my $arg = Storable::thaw( $g->arg );
        my %arg = map { $_ => $arg->{$_} } grep { $_ !~ /^(file|vim_command|vim_options|vim_let)$/ } keys %$arg;
        my $syntax = Text::VimColor->new(%arg);
        return $syntax->html;
    }
);

$worker->work() while 1;


#Text::Hatena::SuperpreNodeを上書き

use Gearman::Client;
use Storable;
sub Text::Hatena::SuperpreNode::format_vimcolor {
    my $self = shift;
    my $s = shift;
    $self->{syntax_type} = $self->{syntax_type} eq '?' ?
        '' : $self->{syntax_type};
    my $client = Gearman::Client->new;
    $client->job_servers( '127.0.0.1' );
    my $result_ref = $client->do_task(
        'vimcolor_html',
        Storable::freeze( { 
            string => $s,
            filetype => $self->{syntax_type},
        } )
    );
    return unless $result_ref;
        $$result_ref;
}


workerとgearmandはdaemontoolsで起動してます

#gearmand起動スクリプト

#!/bin/sh
exec 2>&1
exec setuidgid apache /usr/bin/gearmand


#worker起動スクリプト

#!/bin/sh
exec 2>&1
exec /path/to/Femo/script/vimcolor_worker.pl


こうすると、workerの再起動が、

svc -t /service/worker

で可能になるので、変更の適用がすごく楽になります
万が一プロセスが落ちても、すぐに復帰してくれるのも利点です


これでFastCGIでも動作ができるようになったので、Apacheのmod_perlからNginxのFastCGIへ変更しました
FastCGIのプロセスもdaemontoolsで起動します

#fastcgi起動スクリプト

#!/bin/sh
exec 2>&1
exec /path/to/Femo/script/femo_fastcgi.pl -l 127.0.0.1:9001 -p /var/run/femo_fastcgi.pid -n 3


あとはNginxの設定になります。NginxでCatalystを動かすドキュメントは本家のWikiにもあります。

FastCGIに渡す、パラメータのConfigファイル(nginx_fastcgi_params.conf)

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;

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  PATH_INFO          $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_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;

fastcgi_param REDIRECT_STATUS 200;


Nginxの設定 nginx.conf

http {
    gzip             on;
    server {
        listen 80;
        server_name femo.jp;

        location / {
            fastcgi_pass 127.0.0.1:9001;
            include      /path/to/conf/nginx_fastcgi_params.conf;
        }
        location /static {
            alias /path/to/Femo/root/static;
            expires  31d;
        }
    }
}


全部起動して、設定完了です
パフォーマンスとか全然はかってないけど、なんかモダンになった気がします

workerの危険なオプションを取り除く正規表現を間違えて3〜4時間悩んでいたのは秘密