Passengerを使いBoxroomをサブディレクトリに置く/ FreeBSD9+Apacheの場合


Passengerを使えば、ApacheでRailsアプリケーションが使える。DocumentRoot を boxroom/public にすればルートがアプリケーションになる。

今回、ルートではなくサブディレクトリとして boxroom を使いたかった。この場合も教科書どおりだと、DocumentRootを通常の(例えば) htdocs にしておいて、ここに ln コマンドでUNIXのリンクファイル(いわゆるエイリアス)を作って、これを boxroom/public に繋げばよい。これで、
 http://tools.example.com/boxroom
のようにサブディレクトリに置いたかたちにできる。

例えば以下のようにした。僕の場合、仮想サイトをいくつも設定しているので
/usr/local/etc/apache22/extra/httpd-vhosts.conf
の設定となる。

httpd-vhosts.conf

<VirtualHost xxx.xxx.xxx.xxx:80>
    ServerName tools.example.com
    ServerAdmin admin@example.com
    DocumentRoot "/home/example/www/htdocs"
    RailsEnv production
    RailsBaseURI /boxroom
    XSendFilePath /usr/home/example/www/webapp/boxroom/uploads/tools
    <Directory "/home/example/www/htdocs">
         #Options ExecCGI +FollowSymLinks
         #AllowOverride FileInfo Options
         AllowOverride all
         Order allow,deny
         Allow from all
         Options -MultiViews
    </Directory>

boxroom/publicのエイリアス

そして次に、 /home/example/www/htdocs に

ln -s /usr/home/example/www/webapp/boxroom/public boxroom

とやってエイリアスを作る。
しかし、これだけだと、なぜかファイルのアップロードができないことに気づく。必要なのはJavaScriptのソースの変更であった。

files.js.coffee

files.js.coffee の中の以下の2行に以下のように /boxroom というディレクトリを追加しなければならない。

$.getJSON "/boxroom/file_exists?name=#{encodeURIComponent(file.name)}&folder=#{encodeURIComponent(folder)}", (exists) ->
...
window.location.href = "/boxroom/folders/#{folder}"

以上です。

【おまけ】
(20023)The given path was above the root path: xsendfile: unable to find file: への対処

もう一点はまったことがあった。
アップロードしたものがダウンロードできないのでappacheのエラーログをみてみたところ
(20023)The given path was above the root path: xsendfile: unable to find file: /usr/home/example/www/webapp/boxroom/uploads/tools/11/original/11
となっている。ファイルが見つからないと言っているディレクトリをみると、先頭がなぜか /home/ ではなく /usr/home/ になっているではないか。
そこで、httpd-vhosts.conf の設定で既述のように、

XSendFilePath /usr/home/example/www/webapp/boxroom/uploads/tools

のように /usr/home/ で始まるようにしたら解決した。

広告