書籍転載:Ruby on Rails 4アプリケーションプログラミング
Apache+Passenger環境/Heroku環境への、Railsアプリの配置
書籍転載の最終回。開発したRailsアプリを本番環境へ配置する方法について説明する(「Part 3《応用編》 第10章 Railsの高度な機能」より)。
書籍転載について
ご注意
本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。
前回は、Sass(SCSS)の基礎について解説しました。今回は最終回として、開発したRailsアプリを本番環境へ配置する方法について説明します。
■
10.5 本番環境への移行
Rails(Ruby)では、デフォルトでWEBrickというHTTPサーバを提供しており、Railsをインストールしただけで、最低限、Railsアプリケーションを手元で動作できるようになっています(本書サンプルもWEBrick環境で動作を検証しています)。
もっとも、WEBrickはあくまで導入の簡単さを追求した環境ですので、本番環境で利用するには力不足です。本番環境では、ThinやUnicorn、Apache HTTP Server+Phusion Passenger(以降、Apache+Passenger)のような専用サーバを利用する必要があるでしょう。また、昨今ではRailsアプリケーションを手軽にアップロード&動作できるHerokuのようなクラウドサービスも提供されています。
以下では、本番環境移行への指針として、Apache+Passenger、Heroku環境への移行の手順を紹介します。
10.5.1 Apache+Passenger環境への配置
Passengerは、Apacheに組み込めるRailsアプリケーション実行のためのモジュールで、比較的手軽に導入できるのが特長です。ただし、Passengerは執筆時点ではWindows環境では動作しませんので要注意です。以下でもLinux環境を前提に解説を進めます。
1Apache HTTP Serverをインストールする
Passengerを導入するに先立って、まずはApacheと(データベースサーバとして)MySQLをインストールしておきましょう*37。データベースについては本文と同じくSQLiteを利用することもできますが、本格的な運用にはやや機能不足です。Passengerへの移行と合わせて、データベースも移行してしまいましょう。
- *37 もちろん、1.2節の手順に従ってRails環境が準備されているのは大前提です。
ApacheとMySQLそのもののインストール方法については、本書の守備範囲からも外れますので、ここでは割愛します。詳しい手順は著者サポートサイト「サーバサイド技術の学び舎 - WINGS」から[サーバサイド環境構築設定]などを参考にしてください。本項では、Apache 2.4.6とMySQL 5.5.33aがインストールされていることを前提に、以降の解説を進めていきます。
2Passengerをインストールする
Passengerのインストールそのものは、ごくシンプルな手順で行えます。
# gem install passenger ……Passengerのインストール
Fetching: daemon_controller-1.1.7.gem (100%)
Successfully installed daemon_controller-1.1.7
Fetching: passenger-4.0.26.gem (100%)
Building native extensions. This could take a while...
Successfully installed passenger-4.0.26
…中略…
2 gems installed
# passenger-install-apache2-module ……Apacheモジュールとしてインストール
|
インストールそのものは、Enterキーを押していくだけで先に進められます。インストールに成功すると、あとからhttpd.confの編集に利用するためのコードが表示されますので、コピーして控えておくと良いでしょう(図10-14)。
3httpd.confを編集する
Apacheの設定ファイルhttpd.confに対して、手順2でコピーしておいたコードを追加します。また、ApacheのドキュメントルートをRailsアプリケーションの/publicフォルダに設定しておきましょう(リスト10-55)。
# Example:
# LoadModule foo_module modules/mod_foo.so
LoadModule passenger_module /usr/local/lib/ruby/gems/2.0.0/gems/passenger-4.0.26/buildout/apache2/
mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/2.0.0/gems/passenger-4.0.26
PassengerDefaultRuby /usr/local/bin/ruby
…中略…
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
DocumentRoot "/var/www/html/railbook/public"
|
【NOTE】root権限では動作できない
Passengerは、root権限でRailsアプリケーションを動かせない仕様になっています。Railsではconfig.ruの所有者がそのままアプリケーションの実行ユーザになりますが、これがrootの場合、nobodyユーザで動作するように自動的に切り替わります。この場合、logフォルダやtmpフォルダなどでの書き込みができずにエラーとなってしまうのです。
もしそのようになっている場合には、以下のようなコマンドで所有者を変更してください(ここではグループはwings、ユーザはyyamada)。
chown -R yyamada:wings /var/www/html/railbook/public
|
4mysql2アダプタをインストールする
続いて、アプリケーションからMySQLを利用するための手続きを進めます。
まずは、MySQLデータベースに接続するためのmysql2アダプタをインストールします。railbookアプリケーションのGemfileをリスト10-56のように編集してください。
gem 'sqlite3'
gem 'mysql2'
|
この状態で、bundle installコマンドを実行します*38。
# bundle install
Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
Using rake (10.1.0)
…中略…
Using
on (1.8.1)
Installing mysql2 (0.3.14)
Using tilt (1.4.1)
…中略…
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
|
- *38 mysql2アダプタのインストールには、MySQLの開発ライブラリが必要です。未インストールの場合には、「# yum install mysql-devel」のようにインストールしてください。
5データベース設定ファイルを編集し、データベースを展開する
データベース設定ファイルdatabase.ymlを編集し、本番環境からMySQLに接続するための接続情報を定義します(リスト10-57)。もちろん、ユーザ名やパスワード、データベース名などは、適宜、自分の環境に合わせて修正してください。
production:
adapter: mysql2
encoding: utf8
database: railbook
pool: 5
username: root
password: 12345
socket: /var/lib/mysql/mysql.sock
|
あとは、以下のrakeコマンドを順番に実行し、データベースの作成からスキーマの構築、フィクスチャの展開までを行うだけです*39。
# rake db:create RAILS_ENV=production ……データベースの作成
# rake db:migrate RAILS_ENV=production ……マイグレーションの実行
== CreateBooks: migrating ====================================================
-- create_table(:books)
-> 0.1449s
== CreateBooks: migrated (0.1451s) ===========================================
== CreateAuthorsBooks: migrating =============================================
-- create_table(:authors_books)
-> 0.1246s
== CreateAuthorsBooks: migrated (0.1248s) ====================================
…中略…
== CreateJoinTableAuthorBook: migrated (0.0904s) =============================
# rake db:fixtures:load RAILS_ENV=production ……フィクスチャの展開
|
- *39 フィクスチャは、本来テストデータを表すものですが、ここではとりあえず動作の確認用に利用させてもらいましょう。
6アセットを事前コンパイルする
本番環境ではデフォルトで、アセットの自動コンパイル機能が無効になっています。rakeコマンドで、アセットを事前コンパイルしておく必要があります。
# rake assets:precompile
|
7アプリケーションの動作を確認する
以上で、Apache+PassengerとMySQLの環境でRailsアプリケーションの動作が可能になりました。最後に、次のアドレスからrailbookアプリケーション(本書で作成したアプリケーション)にアクセスできることを確認してください。
図3-1(※転載対象外)のような結果が得られれば、環境は正しく設定できています。
http://localhost/books
10.5.2 Heroku環境への配置
Herokuとは、Railsアプリケーションをホストできるクラウドサービスの一種です。一定の範囲内までであれば無償で利用できますので、まずは試してみたいという場合にも気軽に導入できます。わずかなコマンド操作で、既存のアプリケーションも簡単にデプロイできる点も、急速に人気を集めた理由のひとつでしょう。
以下では、Windows環境での操作を前提に手順を説明しますが、Linux環境でもパスが異なる他は同じ手順で操作できます。
1Gitをインストールする
Herokuを利用するには、ソースコード管理ツールであるGitが必要です*40。
- *40 Gitに関する詳細は、本書では扱いません。「Windowsユーザー向けGit入門」のような記事を参考にしてください。
ダウンロードページからソースコード、またはバイナリを入手して、インストールしてください。
Windows環境であれば、Git-1.8.4-preview20130916.exeをダウンロードします。ダウンロードしたファイルをダブルクリックして、ウィザードに沿っていくだけでインストールできます。途中、[Adjusting your PATH environment]画面(環境変数PATHの設定)では「Run Git from the Windows Command Prompt」(コマンドプロンプトからGitコマンドを実行)をチェックしてください。
Gitをインストールできたら、以下の要領で、SSHの公開鍵を作成してください。
これは、あとからHerokuを操作する際に必要となるものです。途中、鍵の保存先を聞かれますので、「C: \Users\<ユーザ名>\.ssh\id_rsa」のようなパスを入力してください。
> cd C:\Users\<ユーザ名>
> mkdir .ssh
> cd C:\Program Files (x86)\Git\bin
> ssh-keygen
|
2Herokuを利用するためのアカウントを準備する
Herokuを利用するには、まず、Sign Upページからユーザ登録を行ってください。メールアドレスを入力すると、メールアドレスが送信されてきますので、メール本文に記載されたURLにアクセスし、パスワードの登録を行います。
アカウントを作成中である旨の画面が表示された後、[heroku dashboard]画面が表示されます。ページ右肩の▼をクリックして、[Account]リンクをクリックします。アカウント管理画面が表示されたら、[Billing](請求先)の[Add Credit Card]ボタンをクリックし、移動先の画面で必要な請求情報を入力してください。これは、あとからアドオンをインストールするために必要な手続きです(よって、アドオンが不要な場合にはこの作業は不要です)。
3デプロイの前準備を行う
アプリケーションをHerokuにデプロイする前に、いくつかの準備を済ませておきます。
1Heroku APIの導入
Heroku APIは、Herokuへのデプロイからメンテナンスモードへの切り替え、ログの取得など、Herokuを管理するためのライブラリです。gemコマンドで導入できます。
> gem install heroku
|
2Herokuに鍵を登録する
以下のコマンドで、Herokuに作成済みの公開鍵を登録しておきます。コマンドを実行すると、メールアドレス/パスワードを聞かれますので、先ほどユーザ登録で設定した情報を入力してください。
> heroku keys:add
|
3アセットを準備する
production環境ではデフォルトで、アセットの自動コンパイル機能(9.2.2項)が無効になっています。rakeコマンドで、アセットを事前コンパイルしておく必要があります。
> cd c:\data\railbook
> rake assets:precompile
|
また、production環境では、デフォルトでアセットの配信が無効になっています。production.rbを以下のように編集しておきましょう。
config.serve_static_assets = true
|
4pgライブラリをインストールする
Herokuでは標準でPostgreSQLデータベースを提供しています。PostgreSQLに接続するために、アプリケーション側でもGemfileを有効にし、pgライブラリを有効にしておきましょう。SQLiteは使えないのでコメントアウトしておきます。
# gem 'sqlite3'
gem 'pg'
|
Gemfileを更新したら、bundle installコマンドも実行しておきます。
4アプリケーションをHerokuにデプロイする
Herokuでは、Git経由でアプリケーションを登録しますので、あらかじめアプリケーションをGitの管理下に配置してください。
> cd c:\data\railbook
> git init
> git add .
> git commit -m "Railbook Init"
|
「Please tell me who you are.」と表示される場合は、以下のようにメールアドレスとユーザ名を指定して、再度コマンドを入力してください。
> git config --global user.email "メールアドレス"
> git config --global user.name "ユーザー名"
> git commit -m "Railbook Init"
|
あとは、以下のようにherokuコマンドでアプリケーションの作成から登録、マイグレーションなどを行います。
> heroku create ……Herokuにアプリケーションを作成
> heroku addons:add sendgrid:starter ……メール送信アドオンを登録
> git push heroku master ……アプリケーションをHerokuにデプロイ
> heroku run rake db:migrate ……マイグレーションを実行
> heroku run rake db:fixtures:load ……フィクスチャを展開
|
5アプリケーションの動作を確認する
デプロイに成功したら、Herokuの管理ページにアクセスしてください。
表示されているintense-brushlands-1904のようなアプリケーション名は自動で生成されたものなので、その時どきで異なります(名前はあとから変更することもできます)。アプリケーション名に応じて「http://intensebrushlands-1904.heroku.com/books」のようなURLで、ブラウザから正しくアクセスできることを確認しておきましょう。
■
以上で書籍転載は完結です(全11本)。
※以下では、本稿の前後を合わせて5回分(第7回~第11回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
8. CoffeeScript入門(前編) ― CoffeeScriptの基本構文
Rubyプログラマーの必須知識「CoffeeScript」の基礎として、基本構文/変数とリテラル表現/演算子/制御構文を解説。書籍転載の8本目(「Part 3《応用編》 第9章 クライアントサイド開発」より)。
9. CoffeeScript入門(後編) ― 関数/オブジェクト指向構文/即時関数
CoffeeScriptの基礎を解説。今回は関数/オブジェクト指向構文/即時関数について説明する(書籍転載の9本目)。CoffeeScriptをマスターしよう。
10. Sass(SCSS)入門
CSSのコードを生成するための言語「Sass(SCSS)」の基礎として、基本的な使い方/スタイル定義のネスト/変数/演算子/関数/ディレクティブ/について解説。書籍転載の10本目(「Part 3《応用編》 第9章 クライアントサイド開発」より)。