大学生からの Web 開発

廃れない技術よ 我が身に

Vagrant Cloud の Vagrant Share で Rails アプリを公開する

Vagrant Cloud がとても便利。勉強会で成果物をちょっと公開することにすごく向いている。あと、開発中のスマホサイトを実機で確認、なんてこともできる。

Vagrant Cloud の詳細は以下。

Vagrant CloudのVagrant Shareを試してみたら凄すぎて鼻血出た - 憂鬱な世界にネコパンチ!

このエントリーでは Vagrant Cloud で Rails アプリケーションを動かすまでの作業を書く。

※ 「ここまで Box 化」 と書いている部分までの環境構築をした box を Vagrant cloud で公開しているので、アプリケーションを Vagrant Cloud 上で動作させるだけでよい人はこちらを使って欲しい。使い方はエントリーの最下部に書いている。

karur4n/rails_on_centos

f:id:karur4n:20140314024856j:plain

以下 作業ログ

仮想環境を起動するまで

$ vagrant box add centos6.4 https://github.com/2creatives/vagrant-centos/releases/download/v0.1.0/centos64-x86_64-20131030.box
$ mkdir rails_app_vm
$ cd rails_app_vm
$ vagrant init centos6.4
$ vagrant up
$ vagrant ssh

パッケージのアップデート

$ sudo yum -y update

必要なパッケージのインストール。

$ sudo yum install -y openssl-devel curl-devel httpd-devel apr-devel apr-util-devel sqlite-devel

rbenv, ruby-build のインストール。

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

ruby のインストール。

$ rbenv install 2.1.1
$ rbenv global 2.1.1
$ rbenv rehash

centos6 系では一部の gem のインストールに著しく時間がかかる問題があるので修正。

$ sudo vi /etc/resolv.conf
# 次の一文を追加

options single-request-reopen

$ sudo service network restart

apache をインストールし、自動起動を有効にする。

$ sudo yum -y install httpd
$ sudo service httpd start
$ sudo chkconfig httpd on

passenger のインストール。passenger とは apache または Nginx と組み合わせて使うサーバーアプリケーション。比較的導入が簡単で、高いパフォーマンスを実現することができる。

$ gem install passenger --no-ri --no-rdoc
$ rbenv rehash

apache に passenger モジュールをインストール。

$ sudo chmod o+x "/home/vagrant"  # モジュールのインストールのために推奨。

# VM のメモリ量が少ないので passenger のコンパイルのために推奨
$ sudo dd if=/dev/zero of=/swap bs=1M count=1024
$ sudo mkswap /swap
$ sudo swapon /swap

$ passenger-install-apache2-module

# 対話式でインストールしていく。
# Ruby だけへの用途であれば Python のチェックを外しておくと良い。
# コンパイル終了後にいろいろ出るけどとりあえず Enter 押してりゃいいです。

$ rbenv rehash

passenger の設定ファイルを作成する。

$ sudo vi /etc/httpd/conf.d/passenger.conf

LoadModule passenger_module /home/vagrant/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/passenger-4.0.38/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /home/vagrant/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/passenger-4.0.38
  PassengerDefaultRuby /home/vagrant/.rbenv/versions/2.1.1/bin/ruby
</IfModule>

ちなみに上記ファイルの内容はこの環境の場合のものなので、ruby, passenger のバージョンが違うものをインストールした人は以下のコマンドで出力された設定にする。

$ passenger-install-apache2-module --snippet

apache の設定。

# デフォルト設定ファイルのバックアップ
$ sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak

$ sudo vi /etc/httpd/conf/httpd.conf

# 277行目
# /ServerName で見つける
ServerName 192.168.33.10:80

# apache の設定チェック エラーが出るなら修正
$ apachectl configtest
> Syntax OK

$ sudo service httpd restart
$ sudo chkconfig httpd on

rails のインストール。

$ gem install rails --no-ri --no-rdoc
$ rbenv rehash

Rails アプリを同期させる。面倒なデプロイ作業は不要!

$ exit # 一旦抜ける
$ vi Vagrantfile

# ホストオンリーネットワークを構築。
#ファイルの同期に必要。
config.vm.network "private_network", ip: "192.168.33.10"

# アプリケーションファイルを同期させる
# config.vm.synced_folder "アプリケーションへのパス", "仮想環境上でのパス"
# rails_app は各自 アプリケーション名を
# nfs を使うことでパフォーマンスが向上する( Mac 以外は各自導入)
config.vm.synced_folder "path/to/rails_app", "/var/www/rails_app", nfs: true

$ vagrant reload
$ vagrant ssh

レイルズ。

$ cd /var/www/rails_app
$ vi Gemfile

# therubyracer を使っていない人はコメントアウトする
gem 'therubyracer', :platforms => :ruby

$ bundle install
$ rbenv rehash

バーチャルホスト(アプリケーションをドメインに割り当てる機能) を設定する。

$ sudo vi /etc/httpd/conf/httpd.conf
# 追記する

<VirtualHost *:80>
      # development モードで起動するように指定(デフォルトは production モード)
      RailsEnv development
      PassengerEnabled on
      ServerName 192.168.33.10
      # !!! 要書き換え !!!
      # 以下2文の rails_app を書き換える
      DocumentRoot /var/www/rails_app/public
      <Directory /var/www/rails_app/public>
         AllowOverride all
         Options -MultiViews
      </Directory>
</VirtualHost>

apache の設定チェックと再起動。

$ apachectl configtest
> Syntax OK
$ sudo service httpd restart

ファイヤーウォールを停止する。

$ sudo service iptables stop
$ sudo chkconfig iptables off
$ sudo chkconfig --list iptables
iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off

ここまで box 化

http://192.168.33.10 で正しく動作しているか確認する。

Vagrant Cloud 編。

使用中の Vagrant のバージョンが 1.5 より古い人はアップデートしよう。

$ exit
$ vagrant login

# Vagrant Cloud アカウントのユーザー名とパスワードを入力する。

$vagrant share
==> default: Detecting network information for machine...
    default: Local machine address: 192.168.33.10
    default: Local HTTP port: 80
    default: Local HTTPS port: disabled
==> default: Checking authentication and authorization...
==> default: Creating Vagrant Share session...
    default: Share will be at: gullible-jackal-0162
==> default: Your Vagrant Share is running! Name: gullible-jackal-0162
==> default: URL: http://gullible-jackal-0162.vagrantshare.com

そして出力された URL にアクセスすれば OK!

apache や passenger の設定を済ませて、自分に必要なパッケージを入れた段階で box 化すれば、あとはVagrantfileの設定を変更するだけで公開できるからやばい。

box 化する工程はここ見る。
Vagrantのboxに少しだけ手を加えたものをboxとして取っておきたい - Qiita

ここまでの設定を済ませて box 化していれば以下の作業でいい。

$ mkdir app_vm
$ cd app_vm
$ vagrant init mybox(自分で作ったbox)
$ vi Vagrantfile

config.vm.network "private_network", ip: "192.168.33.10"

# path/to/rails_app は各自で変更 右はそのままでいい
config.vm.synced_folder "path/to/rails_app", "/var/www/rails_app", nfs: true

$ vagrant up
$ vagrant login
$ vagrant share

このエントリーでの構築を済ませた karur4n/rails_on_centos を使う人は以下。

vagrant init で公開されている box を指定すればいいだけ。

$ mkdir app_vm
$ cd app_vm
$ vagrant init karur4n/rails_on_centos
$ vi Vagrantfile

config.vm.network "private_network", ip: "192.168.33.10"

# path/to/rails_app は各自で変更 右の rails_app はそのままでいい
config.vm.synced_folder "path/to/rails_app", "/var/www/rails_app", nfs: true

$ vagrant up
$ vagrant login

# vagrant up 直後に vagrant share をしてもなぜか確立してくれない
# ブラウザでアクセス、vagrant ssh、vagrant share を2回する
# ことで解消された 原因がわかる人教えてください

$ vagrant share
$ vagrant share # エラーがでたらもう1回 

vagrant up直後のvagrant shareがエラることにマジで困っているんで、解決法を知ってる人は教えてください。

それ以外はとてもよいよい。

かなり参考にした。
RailsとApacheの連携について - Qiita