313
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

Vagrant で Ruby on Rails 4 の環境構築

はじめに

今回、諸事情により Python 使いの人間が
Ruby on Rails 4 (+ Ruby) 世界に入門することになったので、
そのためのテスト環境構築を行う。

今回は仮想環境上にテスト環境を構築する。
仮想環境として、VirtualBox + Vagrant を用いる。

Ruby は RVM (Ruby のバージョンを管理するためのツール) で管理する。
この記事を作成している時点で最新版の2.1系をインストールする。

また、Rails 自身と Rails に必要な各種ライブラリ (Gem) は Bundler で管理する。
この記事を作成している時点で最新の4.2系をインストールする。

仮想マシン周りの構築

VirtualBox のインストール

https://www.virtualbox.org/wiki/Downloads から最新版をインストール。
仮想環境の作成は Vagrant から行う。

Vagrant のインストール

http://www.vagrantup.com/downloads から最新版をダウンロードしてインストール。

仮想マシンの作成

今回は CentOS6.5 の イメージファイルを使う。
また、仮想環境の作成先ディレクトリは ~/projects/centos6_rails4 とした。

$ vagrant box add centos6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
$ mkdir ~/projects
$ mkdir ~/projects/centos6_rails4
$ cd ~/projects/centos6_rails4
$ vagrant init centos6.5

Vagrantfileの下記の部分を編集してメモリの割り当てを4GBに増やす

Vagrantfile
config.vm.provider "virtualbox" do |vb|
  #   # Don't boot with headless mode
  #   vb.gui = true
  #
  #   # Use VBoxManage to customize the VM. For example to change memory:
  vb.customize ["modifyvm", :id, "--memory", "4096"]
end

また Rails で使用する3000番ポートのポートフォワーディング設定も行う。

Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # ...

  # config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network :"forwarded_port", guest: 3000, host: 3000

  # ...
end

その後、以下のコマンドを実行すると仮想環境にログインできる。

$ vagrant up
$ vagrant ssh

仮想環境から抜ける際は、ssh 接続を閉じればOK。

$ vagrant halt

で仮想マシンの電源を落とせる。
再び仮想環境を起動する際は仮想マシンをインストールしたディレクトリに移動し、
vagrant up -> vagrant ssh とすればよい。

Rubyの環境構築

RVM の導入

Ruby は RVM を使用してバージョンの管理を行う。
下記URLを参考にしつつ作業を進める。
https://rvm.io/rvm/install

下記のコマンドを実行していく。

$ gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
$ sudo yum install -y emacs # 自分の環境に必要なものを先に入れておく
$ sudo yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison iconv-devel
$ curl -L https://get.rvm.io | bash -s stable
$ source .profile

バージョンの確認。

$ rvm -v
rvm 1.26.7 (latest) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

Ruby 2.1.x をインストール。

$ rvm install 2.1
$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
$ ruby -e 'puts("Hello, world!")'
Hello, world!

RVM で Ruby 2.1 がインストールできた。

Rails のインストール

公式等の説明のようにそのまま

$ gem install rails

すると、システム全体に依存関係の Gem がインストールされてしまう。
今回は Rails 自体もプロジェクト毎に Bundler で管理する。

$ mkdir ~/projects
$ mkdir ~/projects/sample_rails_project # sample_rails_project の部分は作成するプロジェクト名に
$ cd ~/projects/sample_rails_project
$ bundle init
Writing new Gemfile to /home/vagrant/project/sample_rails_project/Gemfile

作成されたGemfileを以下のように記述。

Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem "rails"

デフォルトの SQLite3 用のパッケージを先に導入しておく。

$ sudo yum -y install sqlite-devel

Bundler で各種 Gem をプロジェクトのディレクトリ以下にインストールし、
Rails プロジェクトを作成。

$ bundle install --path vendor/bundle
$ bundle exec rails new .
       exist 
      create  README.rdoc
      create  Rakefile
      create  config.ru
      create  .gitignore
    conflict  Gemfile
Overwrite /home/vagrant/project/sample_rails_project/Gemfile? (enter "h" for help) [Ynaqdh]

ここで Y と答えると Rails プロジェクトがカレントディレクトリに作成される。
試しにサーバーを起動。

$ bundle exec rails server

すると以下のようなエラーが。

runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
...

JavaScript の Runtime が必要なのでインストールする。

Gemfile の下記の行のコメントを解除する。

Gemfile(編集前)
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
Gemfile(編集後)
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
gem 'therubyracer', platforms: :ruby

Bundler でインストールする。

$ bundle install --path vendor/bundle

もう一度サーバーを起動。

$ bundle exec rails server
=> Booting WEBrick
=> Rails 4.2.0 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2014-12-31 16:13:09] INFO  WEBrick 1.3.1
[2014-12-31 16:13:09] INFO  ruby 2.1.5 (2014-11-13) [x86_64-linux]
[2014-12-31 16:13:09] INFO  WEBrick::HTTPServer#start: pid=1524 port=3000

Rails のサーバーが立ち上がったのが確認できた。

接続トラブル

ローカル環境のブラウザからhttp://localhost:3000/にアクセスするも、繋がらない。
テストとして、awk でワンライナーサーバーを立てて実験。

以下のコマンドを実行し、ローカルマシンからブラウザ経由でhttp://localhost:3000/にアクセス。

$ awk 'BEGIN {port="3000";s="/inet/tcp/" port "/0/0";RS=ORS="\r\n";for(;;){if((s |& getline) > 0){printf "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\nPort 3000 test" |& s;}close(s);}}'

Port 3000 test が表示されたので、ローカルマシンと Vagrant 環境の通信は問題なし。
今回は Rails 側のトラブルの模様。

原因を探っていると、Rails 4.2 のリリースノートにこんな記述が。

3.3 rails serverのデフォルトホスト
Rackの変更 により、rails serverコマンドを実行した際のデフォルトのホストが0.0.0.0からlocalhostに変更されました。この変更は標準的なローカルでの開発ワークフローにほとんど影響を与えないはずです。http://127.0.0.1:3000 および http://localhost:3000 の動作はどちらも以前と同じであるからです。

ただし、今回の変更により、別のPCからRailsサーバーへのアクセスは以前と同じようにはできなくなります。たとえば、development環境が仮想マシン上にあり、ホストマシンからこのdevelopment環境にアクセスする場合などがこれに該当します。 このような場合、サーバーを起動する際にrails server -b 0.0.0.0とすることで、以前と同じ動作を再現できます。

以前の動作に戻す場合は、必ずファイアウォールを適切に設定し、自社ネットワーク内の信頼できるPCだけが開発用サーバーにアクセスできるようにしてください。

rails serverコマンドを実行する際にIPを指定してやれば良いっぽい。
オプションをつけてサーバーを再び起動。

$ bundle exec rails server -b 0.0.0.0

ローカルマシンからブラウザ経由でhttp://localhost:3000/にアクセスする。

1a9d0352c5f7ac975328afc512aaa04d.png

このような画面がブラウザに表示されればOK。

さいごに

何も考えずに最新版の Rails 4.2 を突っ込んだせいで、
ローカルからの接続時に少々トラブルがあったが、
とりあえず Rails 周りの色々なテストを行える環境ができた。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
313
Help us understand the problem. What are the problem?