apache2にて特定パスへのアクセスをproxyでWebrickに繋ぐ のバックアップ差分(No.2)

更新


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[公開メモ]]

* apache2 の mod_proxy により Webrick で動作する rails アプリケーションを呼び出す [#d14df0e5]
#contents

これ本当に、思った以上に苦労しました。以下は、
* 概要 [#d14df0e5]

これ、思った以上に苦労しました。以下は、
- 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 で動かす [#w959a345]
* そもそも [#v4e72511]

Webrick の性能はそれほど高くないため、
大量のアクセスが見込まれるアプリケーションでは
fast_cgi などを入れる方が良いです。

http://thinkit.co.jp/article/117/4/page/0/1

一方、開発中サイトのレビューなどには Webrick をそのまま外部へ公開
(パスワード等で保護しつつ)できると便利なので調べてみたのでした。

* Webrick を http://myserver.com:3000/myapp で動かす [#w959a345]

これ、結構ややこしいです。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
 $ rails server -p 3000

とすれば http://myserver.com:3000/ で myapp のトップページにアクセスできることを確認しましょう。

で、これを変更して 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
このとき、キャッシュがクリアされずに css 内のリンクが古いままになることがあるため、
起動前にキャッシュをクリアするのが無難です。~
参考:https://github.com/rails/sprockets-rails/issues/108

本来であればこれで完璧であって欲しいところなのですが、
なぜか、rails のルーティングが RAILS_RELATIVE_URL_ROOT を無視するため、
config.ru を編集して、次のようにする必要があります。

(RAILS)/config.ru
 LANG:ruby
 # 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 をデーモンとして起動する [#ze3e5d27]
* Webrick をデーモンとして起動する [#ze3e5d27]

ただ単に 

 LANG:console
 $ RAILS_RELATIVE_URL_ROOT=/myapp rails server -p 3000

としたのでは、ログアウト時にサーバーが止まってしまうので、
Webrick をデーモンとして動かすには、
Webrick をデーモンとして動かすために、

 LANG:console
 $ RAILS_RELATIVE_URL_ROOT=/myapp rails server -p 3000 -d

とします。

止めるときは、

 LANG:console
 $ kill -KILL `cat tmp/pids/server.pid`

です。

参照: http://qiita.com/ginpei/items/7a3b230a51e9dbd1aa72

** 環境を指定して Webrick を動かす [#efec0eb2]
* 環境を指定して Webrick を動かす [#efec0eb2]

当然、本番環境であれば

 LANG:console
 $ RAILS_RELATIVE_URL_ROOT=/myapp rails server -p 3000 -e production -d

ですね。

** apache2 経由で Webrick へアクセスする [#n48488b0]
* apache2 経由で Webrick へアクセスする [#n48488b0]

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" がくせ者で、
とします。

特にこの "ProxyPreserveHost On" がくせ者で、
これがないと "Not Found: /myapp" などと言って怒られ、
とりつく島が無くてうろうろすることになります・・・

参考:http://d.hatena.ne.jp/craccho/20071212/1197487724

* コメント・質問 [#vb48cbd2]

#article_kcaptcha


Counter: 6447 (from 2010/06/03), today: 1, yesterday: 0