X-SendFile, X-REPROXY-FILE, X-REPROXY-URLを試してみる
で試してみました。
一応簡単なノート
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に関しては、何らかの形で事前に取得しといて自前で設定しないとダメだと思います。