すがブロ

sugamasaoのhatenablogだよ

sinatra アプリを Passenger で「Sub URI」で動かす

Sub URIで動かすとは?

ドメイン単位ではなく、ドメイン配下のディレクトリをルートとして環境を構築する場合の話です。
例えば、 http://example.com/ をアプリケーションのルートとする場合ではなく、 http://example.com/hogehoge/ の hogehoge/ をアプリケーションのルートとして扱う場合です。

何がいいたい?

ぶっちゃけ、ドメインを取るまでもない sinatra アプリを、既存のドメイン内で動かしたいんだよってこと。

ディレクトリ構成

設定前に、事前にディレクトリ構成を書いておくと

Sinatra アプリ

/path/to/cgi-bin/sinatra_app/public
/path/to/cgi-bin/sinatra_app/tmp
/path/to/cgi-bin/sinatra_app/config.ru
/path/to/cgi-bin/sinatra_app/app.rb

ドキュメントルート

/path/to/htdocs
/path/to/htdocs/index.html
こんな感じだと思ってください。

共通設定

上記を参考にすると良いでしょう。
特に、PassengerRoot 等の設定 Sub URI で動かすとか関係ない部分ですので、パス自身は適宜環境に合わせるとして、以下のように httpd.conf に以下のように記載しておきます。

####################################
# LoadMocule
####################################
LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.2/ext/apache2/mod_passenger.so

####################################
# Passenger Settings
####################################
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.2
PassengerRuby /usr/local/bin/ruby

Sub URI 用の設定(RackBaseURI せよ)

を参考に、
アプリケーションをシンボリックリンクしておく。

ln -s /path/to/sinatra_app/public /path/to/htdocs/sinatra_app

そして、それらをヒモづけるため、 httpd.conf を編集する。

DocumentRoot /path/to/htdocs
RackBaseURI /sinatra_app

以上でOKなのだが、非常にドハマりしたことがあったので追記しておく。

Apache の設定を無駄にセキュアにしてしまっている人向け

こんな感じに、最初は全て OFF にし、必要なディレクトリだけに設定を許可しているような場合、ハマる可能性がある

<Directory/>                                                                                                                                              
  Order Deny,Allow
  Deny from all
  Options None #<-------ここが元凶!
  AllowOverride None
</Directory>

Options None にしておくと、シンボリックリンクを辿ってくれないので、常に NotFound になるので、せめて htdocs だけでも、シンボリックリンクを許可してあげないといけない。
こんな感じで。

    <Directory /path/to/htdocs>
        Options +FollowSymLinks #<-------- ここで追加してやる
        Order Allow,deny
        Allow from all 
    </Directory>

これだけで2時間くらいハマったんだぜ\(^o^)/

こうすると

http://example.com/sinatra_app/Sinatra アプリに接続できるようになります!