ひさびさにFemoを弄った。
サーバ周りを中心にいくつか改善
まず、以前FastCGIの環境で動かないと書いたText::VimColorをGearmanを使うようにしてみました。
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時間悩んでいたのは秘密