Hatena::ブログ(Diary)

Yet Another Hackadelic

2006-12-12 風雲急

Catalyst-View-Reproxyをリリースしました

というわけでX-REPROXY_URL, X_REPROXY_FILE, X_Sendfileヘッダーを吐いたしてくれるViewクラスってのを作りました。

なんでViewなんですかと言えば、デバッグ時にフロントにPerlbal, Lighttpdじゃなかったりする場合にはLWPで取ってきたりしちゃうよーってのと、将来的にMogileFSのFileを吐き出すViewってを作りたかったんで、こいつを先に作ってみようかなと。

実はもう少しテストの内容だとか修正したかったんですけど、本業の方がアレなのでひとつ大人の事情でアレでナニな訳です。(ぇ


とりあえずPODがおかしいのでそれは直します。ほんとごめんなさい。

2006-12-08 先ほど

X-SendFile, X-REPROXY-FILE, X-REPROXY-URLを試してみる

  • lighttpd : 1.4.13
  • perlbal : 1.53

で試してみました。

一応簡単なノート

X-SendFile

id:typesterさんのCatalyst::Plugin::XSendFileを使いました。

sub index: Private {
    my ($self, $c) = @_;

    $c->res->sendfile('/path/to/file');
}

こんなんで普通にファイルが出力されるんですけども、この時注意しなければいけないのは、Content-TypeもContent-Lengthも出力されないって事です。

自前で$c->res->content_type, $c->res->content_lengthに値を設定する必要があります。

これに関しては後述のX-REPROXY-FILE, X-REPROXY-URLも同じ事が言えます。

X-REPROXY-FILE, X-REPROXY-URL

こちらに関しては次のように使います。

X-REPROXY-FILE: /path/to/file
X-REPROXY-URL: http://mydomain/path/to/file

このようなレスポンスヘッダーがあればPerlbalの方で、出力してくれます。

Content-Type, Content-Lengthに関してはX-SendFileと同様です。

perlbalの設定は凄い簡単にやりました。

/etc/perlbal/perlbal.confにて、

CREATE POOL dynamic
  POOL dynamic ADD 127.0.0.1:80

CREATE SERVICE balancer
  SET listen          = 0.0.0.0:8080
  SET role            = reverse_proxy
  SET pool            = dynamic
  SET persist_client  = on
  SET persist_backend = on
  SET verify_backend  = on
  SET enable_reproxy  = true
ENABLE balancer

SET enable_reproxyをtrueにしておかないとX-REPROXY-*は使えません。

Catalyst側では、

$c->res->header('X-REPROXY-URL', join(" " => 
    "http://mydomain1/path/to/file",
    "http://mydomain2/path/to/file"
));

なんて感じで吐き出せば、このノードリストのいずれかからファイルを取ってきてくれます。


ちなみにX-REPROXY-EXPECTED-SIZEヘッダーを付けると、

期待どおりのファイルサイズが取れない場合はエラーって扱いに出来るみたいです。

正しい場合はContent-Lengthヘッダーを付けてレスポンスを返してくれるのを確認しました。

まとめ

X-REPROXY-*を使う時はX-REPROXY-EXPECTED-LENGTHを併用するのが吉かと。

Content-Typeに関しては、何らかの形で事前に取得しといて自前で設定しないとダメだと思います。

2006-10-25 今日から俺は

コマンドオプション

ほとんど自分用のメモです。

configのsyntax

# lighttpd -f /etc/lighttpd/lighttpd.conf -t

configのprint

# lighttpd -f /etc/lighttpd/lighttpd.conf -p

いずれもちょっと設定を確認するのにちょっと便利かも。