こしごぇ(B)

旧:http://d.hatena.ne.jp/koshigoeb/

Heroku で Reverse Proxy

ろくに調べもせず、明後日の方向に進んでいる気がするけれど。

require 'rack/reverse_proxy'

if ENV['BASIC_AUTH_USERNAME'] && ENV['BASIC_AUTH_PASSWORD'] && !ENV['BASIC_AUTH_USERNAME'].empty? && !ENV['BASIC_AUTH_PASSWORD'].empty?
  use Rack::Auth::Basic do |username, password|
    username == ENV['BASIC_AUTH_USERNAME'] && password == ENV['BASIC_AUTH_PASSWORD']
  end
end

use Rack::ReverseProxy do
  reverse_proxy_options preserve_host: true, replace_response_host: true
  if ENV['BASIC_AUTH_USERNAME'] && ENV['BASIC_AUTH_PASSWORD'] && !ENV['BASIC_AUTH_USERNAME'].empty? && !ENV['BASIC_AUTH_PASSWORD'].empty?
    reverse_proxy '/', ENV['REVERSE_URL'], username: ENV['BASIC_AUTH_USERNAME'], password: ENV['BASIC_AUTH_PASSWORD']
  else
    reverse_proxy '/', ENV['REVERSE_URL']
  end
end

app = proc do |env|
  [ 200, { 'Content-Type' => 'text/plain' }, 'b' ]
end

run app

jaswope/rack-reverse-proxy を使って実現。gem だとリダイレクト対応がされていないので、GitHub の最新ソースを使用。

igrigorik/em-proxy も試してみたけれど、リダイレクト対応がよく分からず断念した。

最新 master ブランチからアプリを作って、デプロイが成功したら Reverse Proxy アプリの環境変数を更新(heroku config:set)してスイッチする、様な感じで使えれば良いな、と。

  • Heroku の dyno 1 個で Reverse Proxy を動かすのはどうなんだろうか
    • EventMachine 系であれば良いのかな
    • Ruby 実装調べちゃったけど、node.js で Reverse Proxy したら良かったのかな
  • リダイレクト対応が怪しい
    • ログイン後にリダイレクトする様なアプリで試して上手くいったけど…
    • google.com のリダイレクトはループした…

まあ、おもちゃ、かな。