日向夏特殊応援部隊

俺様向けメモ

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に関しては、何らかの形で事前に取得しといて自前で設定しないとダメだと思います。