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
で、アプリケーションの動作を確認。
んで、
sudo /usr/local/sbin/nginx -c /path/to/nginx.conf
でnginxを起動する。この状態でhttp://localhost:8081/にアクセスすると、アプリケーションのX-Reproxy-URLで設定していたsinatraのロゴ画像が出力される。