QA@IT

Apache + Passenger で複数の Rails アプリをサブディレクトリで運用する方法

14027 PV

手元の CentOS で Redmine を運用しています。このサーバー上で別の Rails アプリを並行して動かしたいのですが、上手く動かずに困っています。状況は下記の通りです。

状況

Apache + Passenger を使用し, Redmine はサブディレクトリ(/redmine)で運用しています。具体的には, この記事 のように, DocumentRoot から ${RAILS_ROOT}/public にシンボリックリンクを張り, Apache の VirtualHost で RackBaseURI を使用しています。元々 Redmine は問題なく動いていたのですが, ココに新たに Discourse/discourse というサブ URL で動かそうとしたところ上手くいかないという状況です。具体的には・・・

  • /redmine にアクセスすると Redmine が正しく動いている
  • /discourse にアクセスすると Not Found: / と表示される(404 が返ってきている)。
  • /discourse/assets/admin.css などにアクセスすると, 正しく静的ファイルが取得出来る。
  • /var/log/httpd/{access_log, error_log} を見ると, Redmine へのアクセスしか記録されていない。
  • 一方で passenger-status を見ると, Redmine と Discourse が両方稼働している。

Passenger 上では正しく Rails アプリが動いているように見えるのですが, Apache の設定がおかしいのでしょうか?

なお, Redmine, Discourse 共に Production で動かしており, assets の precompile は実行しています。また, discourse の ${RAILS_ROOT} 上で bundle exec rails s -p 9999 -e production 等を実行すると問題なく Rails が起動します。

各種バージョン

  • CentOS : 6.4
  • Apache : 2.2.15
  • Passenger : 3.0.19
  • Redmine : 2.3.0
  • Discourse : master

httpd.conf

httpd.conf の VirtualHost の設定は以下の通りです。/var/www/html/* に, Redmine, Discourse の public ディレクトリに対するシンボリックリンクを張っています。

NameVirtualHost *:80
<VirtualHost *:80>
  ServerName 172.xx.xx.xx
  DocumentRoot /var/www/html
  RackBaseURI /redmine
  <Directory /var/www/html/redmine>
    Options ExecCGI FollowSymLinks
    Options -MultiViews
    AllowOverride All
    Order Allow,Deny
    Allow From All
  </Directory>
  RackBaseURI /discourse
  <Directory /var/www/html/discourse>
    Options ExecCGI FollowSymLinks
    Options -MultiViews
    AllowOverride All
    Order Allow,Deny
    Allow From All
  </Directory>
</VirtualHost>

passenger-status

passenger-status の内容は以下の通りです。

----------- General information -----------
max      = 20
count    = 2
active   = 0
inactive = 2
Waiting on global queue: 0

----------- Application groups -----------
/opt/www/discourse:
  App root: /opt/www/discourse
  * PID: 3528    Sessions: 0    Processed: 4       Uptime: 25m 11s

/opt/www/redmine:
  App root: /opt/www/redmine
  * PID: 30335   Sessions: 0    Processed: 319     Uptime: 5h 27m 49s

アクセスログ等も出ないので今ひとつ状況が分からず, どこから調べていくべきか悩んでいます。心当たりのある方, アドバイス頂けないでしょうか?

よろしくお願い致します。

  • .htaccess ファイルとか -
  • 試しに AllowOverride None にしてみたのですが効果がありませんでした。他に何か原因にお心当たりはあるでしょうか? -
  • そうじゃなく、 .htaccess ファイルの設定のほう -
  • AllowOverride None にしたので .htaccess は使われないと思うのですが違うのでしょうか?もう少し詳しく説明してもらえると助かります・・・。 -

回答

複数railsアプリが原因なのではなく、discourse単体で起きませんか?

redmineとdiscourseをインストールしてみて再現したものの、
結局解決策は見つけられずじまいなんですがエラーログに関して。

discourseの${RAILS_ROOT}/log
にapacheが書き込めるようにしてあげれば(乱暴に言えばchmod -R 777しておけば)production_error.log が出力されるようになります。

あとpassengerのログレベル(0~3、大きいほど詳細)を指定してあげれば、httpdのerror_logにpassengerのログが出力されます。
PassengerRootと同じ並びに指定しておけばいいと思います。

ex)
PassengerLogLevel  3

http://www.modrails.com/documentation/Users%20guide%20Apache.html#_passengerloglevel_lt_integer_gt


以下は余談です。あまり気にしないでください。

discourseは nginx + thin が推奨環境だったり、

VirtualHostに設定するときもDocumentRootはpublicにしていないとブランクページになってしまうとかあったり。
http://meta.discourse.org/t/digital-ocean-discourse-production-install-with-lamp-using-apache/4696/2

production.rbに config.action_controller.relative_url_root='/discourse'
が指定されていたり、publicの中にpublicへのシンボリックリンクがあったり

一筋縄ではいかないかもしれないですね。

編集 履歴 (1)
  • 遅くなってしまいました。ありがとうございます!どうも discourse の問題のようですね・・・。コードも書ける社内掲示板みたいなものがあると良いなーと思って discourse を選んでみたのですが、サブディレクトリで運用出来ないのであれば新しくサーバを用意しないといけないので厳しいですね・・・。 -

ちゃんと質問の内容をよくよんでないのであれですが、自分の場合でうまくいった例を書きます。

apacheでrailsを公開ーー2012/11/5追記の部分を参照しました。

<VirtualHost *:80>
    ServerName 12.34.567.78#ipアドレス
    DocumentRoot /home/lain/rails
    <Directory /home/lain/rails>
        AllowOverride all
        Options -MultiViews
        Options -Indexes
    </Directory>

    RackBaseURI /androidrsslink
    <Directory /home/lain/rails/androidrs>
        Options -MultiViews
        Options -Indexes
    </Directory>

    RackBaseURI /access_log_viewer_link
    <Directory /home/lain/rails/access_log_viewer>
        Options -MultiViews
        Options -Indexes
    </Directory>
</VirtualHost>

自分の場合は、シンボリックリンクを張ってなくてはまったんですが、張ってるようですしなぜでしょうね?

編集 履歴 (0)
  • すみません随分遅くなってしまいましたが、回答ありがとうございます。結局理由は良く分かりませんでしたが discourse の問題のようです。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。