読者です 読者をやめる 読者になる 読者になる

かけるヒトからできるヒト

プログラムを書ける人からプログラムが出来る人へなるために個人的にまとめるブログ

apacheでruby on railsを動かしてみる

apache rails

前回:「apacheが起動してるはずなのにlocalhostにアクセス出来なくなる」、設定をしようとしてapacheすら壊してしまっていたので、こんどこそapacherailsを動かすことに挑戦する。

apache上で動かすことができれば、いちいちサーバを起動せずに、phpのようにプログラムを転送するだけで、サーバ上で公開する事ができるのだ!

環境

http://demo.localhostにアクセスした時にrailsのアプリケーションが動作するように設定する。

mac osx lion

ruby 1.9.3p327

rails 3.2.13

アプリケーションの作成

早速railsのアプリケーションを作成してみる。

今回はapache上で動かす事にするので、「/User/ユーザ名/Sites/」の下にrailstestというディレクトリを作って、その中で動かしてみることにする。

ディレクトリ移動

$ cd /User/ユーザ名/Sites/railstest/

demoという名前でアプリケーション作成。

今回はデータベースにmysqlを使ってみようと思い、その設定を追加して作成。

$ rails new demo -d mysql

すると、「/User/ユーザ名/Sites/railstest」の直下に、demoというディレクトリができる。

そこに移動してrailsのサーバを起動してみたらエラーが出た。

$ cd demo
$ sudo rails s (もしくは$ rails server) => Booting WEBrick => Rails 3.2.13 application starting in development on http://0.0.0.0:3000 => Call with -d to detach => Ctrl-C to shutdown server Exiting /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/mysql2-0.3.11/lib/mysql2/client.rb:44:in `connect': Unknown database 'demo_development' (Mysql2::Error) from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/mysql2-0.3.11/lib/mysql2/client.rb:44:in `initialize' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/mysql2_adapter.rb:16:in `new' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/mysql2_adapter.rb:16:in `mysql2_connection' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_pool.rb:315:in `new_connection' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_pool.rb:325:in `checkout_new_connection' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_pool.rb:247:in `block (2 levels) in checkout' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_pool.rb:242:in `loop' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_pool.rb:242:in `block in checkout' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_pool.rb:239:in `checkout' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_pool.rb:102:in `block in connection' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_pool.rb:101:in `connection' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_pool.rb:410:in `retrieve_connection' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb:171:in `retrieve_connection' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/connection_specification.rb:145:in `connection' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/railtie.rb:88:in `block in ' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/initializable.rb:30:in `instance_exec' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/initializable.rb:30:in `run' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/initializable.rb:55:in `block in run_initializers' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/initializable.rb:54:in `each' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/initializable.rb:54:in `run_initializers' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/application.rb:136:in `initialize!' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/railtie/configurable.rb:30:in `method_missing' from /Users/ユーザ名/Sites/railstest/demo/config/environment.rb:5:in `' from /Users/ユーザ名/Sites/railstest/demo/config.ru:3:in `require' from /Users/ユーザ名/Sites/railstest/demo/config.ru:3:in `block in
' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/rack-1.4.5/lib/rack/builder.rb:51:in `instance_eval' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/rack-1.4.5/lib/rack/builder.rb:51:in `initialize' from /Users/ユーザ名/Sites/railstest/demo/config.ru:in `new' from /Users/ユーザ名/Sites/railstest/demo/config.ru:in `
' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/rack-1.4.5/lib/rack/builder.rb:40:in `eval' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/rack-1.4.5/lib/rack/builder.rb:40:in `parse_file' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/rack-1.4.5/lib/rack/server.rb:200:in `app' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/server.rb:46:in `app' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/rack-1.4.5/lib/rack/server.rb:304:in `wrapped_app' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/rack-1.4.5/lib/rack/server.rb:254:in `start' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/server.rb:70:in `start' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands.rb:55:in `block in ' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands.rb:50:in `tap' from /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands.rb:50:in `' from script/rails:6:in `require' from script/rails:6:in `
'

エラーを読んでみるとunknown databaseちうことで、そんなデータベースないよ!って言われてるようだ。

なので、mysqlでそのデータベースを作ってやる。

$ mysql -uroot -phogehoge 
create database demo_development;

こんどこそ起動に成功

$ sudo rails s
=> Booting WEBrick
=> Rails 3.2.13 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2013-06-27 21:02:58] INFO  WEBrick 1.3.1
[2013-06-27 21:02:58] INFO  ruby 1.9.3 (2012-11-10) [x86_64-darwin12.4.0] 

ここで、「http://localhost:3000」にアクセスすると

f:id:koh110:20130627211920p:plain

こんなページが表示される。

これでrailsの起動は確認できた。

 

apache上で動かす

いよいよapache上で動かす。

railsのpassengerというものをインストールして、virtualhostを設定する。

virtualhostについては別記事で。

passengerをインストールして、apacheのモジュールをインストールする

$ gem install passenger
$ passenger-install-apache2-module

すると、親切な事にpassengerの設定の仕方がコンソールに表示される

#passenger-install-apache2-module --snippet↲
  3 LoadModule passenger_module /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1    .9.1/gems/passenger-4.0.5/libout/apache2/mod_passenger.so↲
  4    PassengerRoot /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/p    assenger-4.0.5↲
  5    PassengerDefaultRuby /Users/ユーザ名/.rbenv/versions/1.9.3-p327/bin/ruby↲
--------------------------------------------
Deploying a Ruby on Rails application: an example

Suppose you have a Ruby on Rails application in /somewhere. Add a virtual host
to your Apache configuration file, and set its DocumentRoot to
/somewhere/public, like this:
<virtualhost :80>
      ServerName www.yourhost.com
      DocumentRoot /somewhere/public
</virtualhost>

これを自分の設定にそろえてhttpd.confのなかに書き込む

なんとなく僕は今回保守性を考えてhttpd.confのなかに

Include /private/etc/apache2/other/*.conf

を追加して「/private/etc/apache2/other/passenger.conf」を作り、設定を全部そこにぶちこんだ。

今回はdemo.localhostというドメインで運用しようと思うので、passenge.confの中身は以下のようになる。

#passenger-install-apache2-module --snippet
LoadModule passenger_module /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1    .9.1/gems/passenger-4.0.5/libout/apache2/mod_passenger.so
PassengerRoot /Users/ユーザ名/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/p    assenger-4.0.5
PassengerDefaultRuby /Users/ユーザ名/.rbenv/versions/1.9.3-p327/bin/ruby

<VirtualHost *:80> ServerName demo.localhost # !!! Be sure to point DocumentRoot to 'public'! DocumentRoot "/Users/ユーザ名/Sites/railstest/demo/public" RailsEnv development <Directory "/Users/ユーザ名/Sites/railstest/demo/public"> # This relaxes Apache security settings. AllowOverride all # MultiViews must be turned off. Options -MultiViews </Directory> </VirtualHost>

httpd.confをいじり終わったらapacheを再起動して設定を読みこませる

sudo apachectl restart

ここでhotsファイルに「127.0.0.1 demo.localhost」を追加して、「http://demo.localhost」にアクセスすると、サーバを起動してないのに、さっきと同じページにアクセスできた。

f:id:koh110:20130627211925p:plain

 

なぜか最初全然アクセスできなかったけど、railsではドキュメントルートは「アプリケーション名/public」というpublicと名前のついたフォルダにアクセスさせなければならないという事にひっかかっていた。

ディレクトリ等を指定する時は最後にpublicを忘れないよう注意

 

まとめ

apacherailsを動かすための設定をした