Passenger 2.0 RC1でMerbを動かしてみた(Ubuntu 8.04)
Rails用Apacheモジュールとして話題をかっさらったmod_rubyことPassengerですが、v2.0ではRackとWSGIをサポートしたことでRails以外の(Rack対応した)フレームワーク、およびPythonのDjangoまで動くというめちゃくちゃ野心的な動きをしています(「勘違いしないでくれ。主眼はあくまでRailsのサポートであって、WSGIサポートはpassengerの柔軟なアーキテクチャを示すためだ」とか言ってますが)。
というわけでZed Shawがいかしたフレームワークと呼ぶMerbをPassenger 2.0 RC1で動かしてみた。以下Ubuntu 8.04をベースに進めていきますが、適宜読み替えてもらえば他のディストリでも大丈夫だと思います。
結論からいうと
MERB_ROOTにconfig.ruって名前のrackup用ファイルをおいとけばPassengerが勝手に読むみたい。あるいはRackBaseURIで明示的に指定っぽい。
Passenger 2.0 RC1のインストール
~/# wget http://phusion-passenger.googlecode.com/files/passenger-1.9.0.gem ~/# sudo gem install passenger-1.9.0.gem ~/# sudo passenger-install-apache2-module --snip-- Please edit your Apache configuration file, and add these lines: LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-1.9.0/ext/apache2/mod_passenger.so PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-1.9.0 PassengerRuby /usr/bin/ruby1.8
/etc/apache2/mods-available/passenger.confにLoadModule....をコピペして、mods-enable/passenger.confからシンボリックリンクを張る。
とりあえず試すだけならhttpd.confにコピペしてもいい。
Merbインストール
SQLite3とかはとりあえず入ってるものと仮定。
~/ # sudo gem install activerecord merb merb_has_flash merb_helpers merb_activerecord --snip-- ~/ # merb -v merb 0.9.3 ()
Merbでつくる
Jamie Hoover - Merb, SQLite, and Nginx on Ubuntuとかmerb.introを参考に進める。
rake dm:db:automigrateが動かなかったのでDataMapperじゃなくてActiveRecordを使うことにした。
~/ # merb-gen app testapp
~/ # cd testapp
~/testapp # vim config/init.rb
# Uncomment for ActiveRecord ORM
use_orm :activerecord
~/testapp # merb-gen resource article title:string body:text
-- config/database.ymlが無いっておこられる --
~/testapp # mv config/database.yml.sample config/database.yml
~/testapp # vim config/database.yml
---
# This is a sample database file for the ActiveRecord ORM
:development: &defaults
:adapter: sqlite3
:database: sample_development
:username: the_user
:password: secrets
:host: localhost
:socket: /tmp/mysql.sock
:encoding: utf8
:test:
<<: *defaults
:database: sample_test
:production:
<<: *defaults
:database: sample_production
~/testapp # merb-gen resource article title:string body:text
dependency model
exists app
create app/models
create app/models/article.rb
dependency migration
create schema/migrations
exists schema
exists schema/migrations
create schema/migrations/001_article_migration.rb
dependency merb_model_test
exists spec
create spec/models
create spec/models/article_spec.rb
dependency resource_controller
exists app
exists app/helpers
exists app/views
create app/views/articles
exists app/controllers
create app/helpers/articles_helper.rb
create app/views/articles/show.html.erb
create app/views/articles/index.html.erb
create app/views/articles/edit.html.erb
create app/views/articles/new.html.erb
create app/controllers/articles.rb
dependency merb_resource_controller_test
create spec/controllers/
create spec/helpers/
exists spec
exists spec/helpers
create spec/views
create spec/views/articles
exists spec/controllers
create spec/helpers/articles_helpers.rb
create spec/views/articles/delete.html.erb_spec.rb
create spec/views/articles/index.html.erb_spec.rb
create spec/views/articles/edit.html.erb_spec.rb
create spec/views/articles/new.html.erb_spec.rb
create spec/views/articles/show.html.erb_spec.rb
create spec/controllers/articles_spec.rb
~/testapp # rake db:migrate
--snip--
~/testapp # merb -p 3001
とりあえず普通にMerbが動くかテスト。http://localhost:3001/articlesを見てみて「Edit this file in app/views/articles/index.html.erb」とか表示されたらOK。
続いてPassengerの設定。Merb Wiki | Phusion Passengerを参考に。
~/testapp # vim config.ru
# config.ru
require 'rubygems'
require 'merb-core'
Merb::Config.setup(:merb_root => ".",
:environment => ENV['RACK_ENV'])
Merb.environment = Merb::Config[:environment]
Merb.root = Merb::Config[:merb_root]
Merb::BootLoader.run
run Merb::Rack::Application.new
~/testapp # sudo vim /etc/apache2/httpd.conf
<virtualhost *:80>
ServerName merb-test
RackEnv development
DocumentRoot /home/myname/testapp/public
ErrorLog /home/myname/testapp/log/error.log
</virtualhost>
~/testapp # sudo /etc/init.d/apache2 force-reload
/etc/hostsに「127.0.0.1 merb-test」を追加して、http://merb-test/が見れたら成功。