apache2にて特定パスへのアクセスをproxyでWebrickに繋ぐ の履歴(No.1)
更新apache2 の mod_proxy により Webrick で動作する rails アプリケーションを呼び出す†
これ本当に、思った以上に苦労しました。以下は、
- ruby 1.9.3p194
- Rails 4.0.4
- Webrick 1.3.1
- apache2 2.2.22-13+deb7u1
での調査結果です。
やりたいことは、
- Webrick で rails アプリケーションを動かす
- http://myserver.com/myapp へのアクセスを、apache2 の mod_proxy で上記 Webrick へ転送する
なのですが、これと同時に、
- rails 内の link_to などの飛び先を http://myserver.com/link1 ではなく http://myserver.com/myapp/link1 にしなければならない
という問題も解決しなければなりません。
Webrick を http://myserver.com:3000/myapp で動かす†
これ、結構ややこしいです。Web上でも情報が錯綜している感じでした。 https://github.com/rails/rails/issues/5122 でもまだ open のままだし。
参考:http://quickhack.net/nom/blog/2012-09-19-rails-with-relative-url-root.html
まず、普通に
LANG:console rails server -p 3000
とすれば http://myserver.com:3000/ で myapp のトップページにアクセスできることを確認しましょう。
で、これを変更して http://myserver.com:3000/myapp へのアクセスでトップページを表示するために、
LANG:console $ rm -r tmp/cache/assets/ $ RAILS_RELATIVE_URL_ROOT=/myapp rails server -p 3000
とします。
これでもう一度 http://myserver.com:3000/ へアクセスすれば、html ソース上における css や js, image など、assets へのリンクが /assets/* から /myapp/assets/* に書き換えられていることを確認できます。
このとき、キャッシュがクリアされないと古い内容が表示されるため、 起動前にキャッシュをクリアしています。 https://github.com/rails/sprockets-rails/issues/108
本来であればこれで完璧であって欲しいところなのですが、 なぜか、rails のルーティングが RAILS_RELATIVE_URL_ROOT を無視するため、 config.ru を編集して、次のようにする必要があります。
(RAILS)/config.ru
# run Rails.application map ActionController::Base.config.relative_url_root || "/" do run Rails.application end
これで Webrick サーバーを再起動すれば、
LANG:console $ rm -r tmp/cache/assets/ $ RAILS_RELATIVE_URL_ROOT=/myapp rails server -p 3000
http://myserver.com:3000/myapp でアプリケーションが動くようになっているはずです。
Webrick をデーモンとして起動する†
ただ単に
LANG:console $ RAILS_RELATIVE_URL_ROOT=/myapp rails server -p 3000
としたのでは、ログアウト時にサーバーが止まってしまうので、 Webrick をデーモンとして動かすには、
LANG:console $ RAILS_RELATIVE_URL_ROOT=/myapp rails server -p 3000 -d
とします。
止めるときは、
LANG:console $ kill -KILL `cat tmp/pids/server.pid`
環境を指定して Webrick を動かす†
当然、本番環境であれば
LANG:console $ RAILS_RELATIVE_URL_ROOT=/myapp rails server -p 3000 -e production -d
ですね。
apache2 経由で Webrick へアクセスする†
mod_proxy と mod_proxy_http を入れます。Debian なら、
LANG:console $ sudo a2enmod proxy $ sudo a2enmod proxy_http
でOKです。
/etc/apache2/sites-enabled/001-myapp のようなファイルを作って、
<VirtualHost *:80> ProxyRequests Off ProxyPreserveHost On <Proxy *> AddDefaultCharset off Order deny,allow Allow from all </Proxy> ProxyPass /myapp http://localhost:3000/myapp ProxyPassReverse /myapp http://localhost:3000/myapp </VirtualHost>
とします。特にこの "ProxyPreserveHost On" がくせ者で、 これがないと "Not Found: /myapp" などと言って怒られ、 とりつく島が無くてうろうろすることになります・・・