nginxを使ったreproxyの方法について軽くメモ

 そもそも僕がreproxyについて勘違いしていて、「ヘッダの情報を使ってアクセスってあるけど、そのヘッダはどうやって定義するんや。。。」と思っていたのですが、reproxyのキモはアプリケーションでファイル取得のような重い処理をさせないためのものなんですね。もしかしたら本来の趣旨は違うかもしれないけど、今の僕の理解はそれ。

worker_processes  1;
error_log  logs/error.log;
daemon off;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen       8081;
        server_name  localhost;

        location / {
            proxy_redirect          off;
            proxy_set_header        Host            $host;
            proxy_pass   http://127.0.0.1:4567;
        }

        location /reploxy {
            internal;
            resolver 8.8.8.8;
            set $reproxy  $upstream_http_x_reproxy_url;
            proxy_pass $reproxy;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}

 例えばこんな感じでnginxを設定する。アプリケーション側は最近熱を上げてるsinatraにて。

require 'sinatra'

get '/' do
  response['X-Accel-Redirect'] = '/reploxy'
  response['X-Reproxy-URL'] = 'http://www.sinatrarb.com/images/logo.gif'
end

 これを

ruby -rrubygems test.rb

 で起動する。

% curl -i http://localhost:4567/
HTTP/1.1 200 OK
X-Frame-Options: sameorigin
X-Xss-Protection: 1; mode=block
Content-Type: text/html;charset=utf-8
X-Accel-Redirect: /reploxy
X-Reproxy-Url: http://www.sinatrarb.com/images/logo.gif
Content-Length: 40
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-07-09)
Date: Thu, 20 Oct 2011 13:50:30 GMT
Connection: Keep-Alive

http://www.sinatrarb.com/images/logo.gif

 で、アプリケーションの動作を確認。
 んで、

sudo /usr/local/sbin/nginx -c /path/to/nginx.conf

 でnginxを起動する。この状態でhttp://localhost:8081/にアクセスすると、アプリケーションのX-Reproxy-URLで設定していたsinatraのロゴ画像が出力される。