memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

passengerの設定がなんとかうまくいった

▪️背景

1年後期の少人数授業で、小学生にプログラミングを教えるツールとしてコロコロ工作ブロックでいろいろなゲームを作ってもらっています。

コロコロ工作ブロックはVisual Programming Languageの一種なのですが、同様の言語のScratchよりゲームに特化していて手軽に始められる特徴があります(小学生でも1時間もあればゲームらしいものができます)。

コロコロ工作ブロックにはenchant.jsの9leap.netのような公開サイトがありません。

練習用とはいえ大学生が90分かけて作った作品なのでなかなかの出来の作品もあります。

そのまま捨ててしまうのはもったいないので。。。Railsで簡単なデータ記録用アプリを作っていました。

で、研究室サーバーにのせようPassengerの設定をしてみたもののうまく動作しない。。。以前、サーバーがCentOSのときに導入したことがあるのですが、そんなに苦労した記憶はなく。。。1日くらいあれこれ試行錯誤していました。結論から言いますと、VirtualHostの動作や設定方法を知らなかったのが原因でした。

Rails + Passenger導入の記事はRails界隈の方がわかりやすく書いてくださっていますのでそちらを参考にさせていただきまして。ただ、Passengerが吐き出すモジュールやVirtualHostの設定部分は書かれているのですが、既存のconfファイルの記述をどうすればいい、と書いているページはなかったので。。。以下です(そんなことは知っていて当然ということなのかと)

▪️本題

※以下、自分用のメモです。私は日頃からrubyrailsを追っかけているわけではありませんので、たまたまうまくいったという情報になります。もし参考にされる場合はそういう観点でご覧いただければと思います。

環境はOSX10.9 Serverです。rubyrailsとpassengerはそれぞれ現時点の最新です(だと思います)。

railsアプリを作成して、rbenv環境のgemでpassengerをinstallします。このあたりはぐぐるとたくさん記事があります。

で、passengerの導入アプリ(passenger-install-apache2-module)を実行すると、モジュールとVirtualHostの設定が吐き出されますので、それを既存のconfファイルに追記します。※ちなみに、centos系の手順記事にはsudoをつけるように書いていますが、rbenv環境では自分のホーム以下にインストールされますのでsudoは不要です。つけても影響はないと思いますが。。。(でもgem uninstall passengerしてもroot権限のディレクトリは削除されないと思いますので残骸が残ります)

具体的な手順はここからになります。いつもながら前置きが長くてすいません。

サーバーのapacheの設定ファイルは/Library/Server/Web/Config/apache2以下にあります(←OSX Serverなので普通のOSXapacheとは設定ファイルの位置が異なります)。その他の設定ということで、/Library/Server/Web/Config/apache2/otherにrails.confというファイルを新規作成して、そこにpassengerのモジュール定義とvirtualhostの定義を書きました。

以下がrails.confの中身です。

LoadModule passenger_module /Users/ユーザー名/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/passenger-4.0.53/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /Users/ユーザー名/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/passenger-4.0.53
  PassengerDefaultRuby /Users/ユーザー名/.rbenv/versions/2.1.4/bin/ruby
</IfModule>

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName 研究室HPを公開しているサーバー名
  DocumentRoot /Library/Server/Web/Data/Sites/Default
</VirtualHost>

<VirtualHost *:80>
   ServerName Railsアプリ用のサーバー名
   # !!! Be sure to point DocumentRoot to 'public'!
   DocumentRoot /Users/ユーザー名/rails/koro/public
   RailsEnv development
   <Directory /Users/ユーザー名/rails/koro/public>
      # This relaxes Apache security settings.
      AllowOverride all 
      # MultiViews must be turned off.
      Options -MultiViews
   </Directory>
</VirtualHost>

上記のポイントとしては「NameVirtualHost *:80」を入れることと「研究室HPを公開しているサーバー名」の定義のところです。たいていのpassenger導入エントリーには「Railsアプリ用のサーバー名」のVitrualHostの記述方法は書かれているのですが、もともと公開していたサーバー名のことには触れられていませんでした。といいますが、あとでわかったのですがVirtualHostを定義するときの基本なんですね。。。それを知らなかったためはまったということです。

で、もう一つ。

おおもとのApacheの設定ファイル(httpd_server_app.conf)にある、ServerNameとDocumentRootはコメントアウトします。ここも大切です。ここが残っていると「Railsアプリ用のサーバー名」の定義は反映されないようです。内部の仕組みはわかりませんが、Apacheのドキュメントには以下のように書かれていました。それでピンときた次第でした。

メインホストはなくなります

既にあるウェブサーバにバーチャルホストを追加する場合、 既存のウェブサーバに対しても ブロックを作らなければなりません。このバーチャルホストの ServerName と DocumentRoot は、グローバルな ServerName と DocumentRoot と同じものにします。また、このバーチャルホストを設定ファイルの中で 先頭に置いて、デフォルトホストとして動作するようにします。

とりあえずうまく動いてよかった。こんなこと書いたエントリーは見当たらなかったので普通はこんなところでつまづかないのでしょうね。。。情けない。