Vagrant Cloud の Vagrant Share で Rails アプリを公開する
Vagrant Cloud がとても便利。勉強会で成果物をちょっと公開することにすごく向いている。あと、開発中のスマホサイトを実機で確認、なんてこともできる。
Vagrant Cloud の詳細は以下。
Vagrant CloudのVagrant Shareを試してみたら凄すぎて鼻血出た - 憂鬱な世界にネコパンチ!
このエントリーでは Vagrant Cloud で Rails アプリケーションを動かすまでの作業を書く。
※ 「ここまで Box 化」 と書いている部分までの環境構築をした box を Vagrant cloud で公開しているので、アプリケーションを Vagrant Cloud 上で動作させるだけでよい人はこちらを使って欲しい。使い方はエントリーの最下部に書いている。
以下 作業ログ
仮想環境を起動するまで
$ 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
$ 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