開発者ドキュメント

Ubuntu14.04でUnicornとNginxを使用してRailsアプリをデプロイする方法

序章

Ruby on Railsアプリケーションをデプロイする準備ができたら、考慮すべき多くの有効なセットアップがあります。 このチュートリアルは、Ubuntu 14.04でUnicornとNginxを使用して、データベースとしてPostgreSQLを使用し、RubyonRailsアプリケーションの本番環境をデプロイするのに役立ちます。

Unicornは、PassengerPumaのようなアプリケーションサーバーであり、Railsアプリケーションがリクエストを同時に処理できるようにします。 Unicornはユーザーが直接アクセスするようには設計されていないため、ユーザーとRailsアプリケーション間の要求と応答をバッファリングするリバースプロキシとしてNginxを使用します。

前提条件

このチュートリアルでは、アプリケーションをデプロイするユーザーに、次のソフトウェアがインストールされたUbuntu14.04サーバーがあることを前提としています。

まだ設定していない場合は、上記のリンク先のチュートリアルに従ってください。 ユーザーの名前はdeployであると想定します。

また、このチュートリアルでは、開発環境またはテスト環境をセットアップする方法については説明していません。 それについてサポートが必要な場合は、PostgreSQLwithRailsチュートリアルの例に従ってください。

Railsアプリケーションを作成する

理想的には、デプロイしたいRailsアプリケーションがすでにあるはずです。 この場合は、このセクションをスキップして、フォローしながら適切な置換を行うことができます。 そうでない場合、最初のステップは、データベースとしてPostgreSQLを使用する新しいRailsアプリケーションを作成することです。

このコマンドは、データベースとしてPostgreSQLを使用する「appname」という名前の新しいRailsアプリケーションを作成します。 強調表示された「appname」を他のものに自由に置き換えてください。

  1. rails new appname -d postgresql

次に、アプリケーションディレクトリに移動します。

  1. cd appname

Railsアプリケーションの本番環境で使用されるPostgreSQLユーザーを作成してみましょう。

本番データベースユーザーの作成

簡単にするために、本番データベースのユーザーにアプリケーション名と同じ名前を付けましょう。 たとえば、アプリケーションの名前が「appname」の場合、次のようなPostgreSQLユーザーを作成する必要があります。

  1. sudo -u postgres createuser -s appname

データベースユーザーのパスワードを設定したいので、次のようにPostgreSQLコンソールに入ります。

  1. sudo -u postgres psql

次に、データベースユーザーのパスワード(例では「appname」)を次のように設定します。

  1. \password appname

希望のパスワードを入力して確認します。

次のコマンドでPostgreSQLコンソールを終了します。

  1. \q

これで、適切なデータベース接続情報を使用してアプリケーションを構成する準備が整いました。

データベース接続の構成

アプリケーションのルートディレクトリ(cd ~/appname)にいることを確認してください。

アプリケーションのデータベース構成ファイルをお気に入りのテキストエディターで開きます。 viを使用します:

  1. vi config/database.yml

defaultセクションで、「pool:5」という行を見つけ、その下に次の行を追加します(まだ存在しない場合)。

  host: localhost

ファイルの一番下までスクロールすると、productionセクションが次のように設定されていることがわかります。

  username: appname
  password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>

本番ユーザー名が以前に作成したデータベースユーザーと一致しない場合は、ここで設定します。

データベースパスワードは、環境変数APPNAME_DATABASE_PASSWORDによって読み取られるように構成されていることに注意してください。 Gitなどの分散バージョン管理システムを使用している場合は簡単に公開される可能性があるため、本番パスワードとシークレットをアプリケーションコードベースの外部に保持することをお勧めします。 次に、環境変数を使用してデータベース認証を設定する方法について説明します。

rbenv-varsプラグインをインストールします

本番Railsアプリケーションをデプロイする前に、環境変数を使用して本番秘密鍵とデータベースパスワードを設定する必要があります。 実行時にパスワードとシークレットをアプリケーションにロードするために使用できる環境変数を管理する簡単な方法は、rbenv-varsプラグインを使用することです。

rbenv-varsプラグインをインストールするには、.rbenv/pluginsディレクトリに移動し、GitHubからクローンを作成します。 たとえば、rbenvがホームディレクトリにインストールされている場合は、次のコマンドを実行します。

  1. cd ~/.rbenv/plugins
  2. git clone https://github.com/sstephenson/rbenv-vars.git

環境変数を設定する

rbenv-varsプラグインがインストールされたので、必要な環境変数を設定しましょう。

まず、署名されたCookieの整合性を検証するために使用される秘密鍵を生成します。

  1. cd ~/appname
  2. rake secret

生成された秘密鍵をコピーし、お好きなエディタで.rbenv-varsファイルを開きます。 viを使用します:

  1. vi .rbenv-vars

ここで設定した環境変数はすべて、Railsアプリケーションで読み取ることができます。

まず、SECRET_KEY_BASE変数を次のように設定します(強調表示されたテキストを、生成してコピーしたばかりのシークレットに置き換えます)。

SECRET_KEY_BASE=your_generated_secret

次に、APPNAME_DATABASE_PASSWORD変数を次のように設定します(強調表示された「APPNAME」をアプリケーション名に置き換え、「prod_db_pass」を本番データベースのユーザーパスワードに置き換えます)。

APPNAME_DATABASE_PASSWORD=prod_db_pass

保存して終了。

次のコマンドを実行すると、rbenv-varsプラグインを使用してアプリケーションに設定されている環境変数を確認できます。

  1. rbenv vars

シークレットまたはデータベースのパスワードを変更した場合は、.rbenv-varsファイルを更新してください。 このファイルをプライベートに保つように注意し、パブリックコードリポジトリを含めないでください。

本番データベースの作成

アプリケーションがPostgreSQLデータベースと通信するように構成されたので、本番データベースを作成しましょう。

  1. RAILS_ENV=production rake db:create

コントローラーを生成する

例に沿って従う場合は、スキャフォールドコントローラーを生成するので、アプリケーションで確認することができます。

  1. rails generate scaffold Task title:string note:text

次に、次のコマンドを実行して、実動データベースを更新します。

  1. RAILS_ENV=production rake db:migrate

アセットのプリコンパイル

この時点で、アプリケーションは機能するはずですが、画像、CSS、およびスクリプトが読み込まれるように、アセットをプリコンパイルする必要があります。 これを行うには、次のコマンドを実行します。

  1. RAILS_ENV=production rake assets:precompile

テストアプリケーション

アプリケーションが機能するかどうかをテストするには、本番環境を実行し、それをサーバーのパブリックIPアドレスにバインドします(サーバーのパブリックIPアドレスに置き換えます)。

  1. RAILS_ENV=production rails server --binding=server_public_IP

次に、Webブラウザで次のURLにアクセスします。

http://server_public_IP:3000/tasks

正常に動作している場合は、次のページが表示されます。

Railsサーバーに戻り、Ctrl-cを押してアプリケーションを停止します。

Unicornをインストールする

これで、Unicornをインストールする準備が整いました。

これを行う簡単な方法は、アプリケーションのGemfileに追加することです。 お気に入りのエディターでGemfileを開きます(アプリケーションのルートディレクトリにいることを確認してください)。

  1. vi Gemfile

ファイルの最後に、次の行を使用してUnicorngemを追加します。

gem 'unicorn'

保存して終了。

Unicornと未解決の依存関係をインストールするには、Bundlerを実行します。

  1. bundle

これでUnicornがインストールされましたが、構成する必要があります。

ユニコーンを構成する

Unicorn構成をconfig/unicorn.rbに追加しましょう。 テキストエディタでファイルを開きます。

  1. vi config/unicorn.rb

この構成をコピーしてファイルに貼り付けます。

# set path to application
app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"
working_directory app_dir


# Set unicorn options
worker_processes 2
preload_app true
timeout 30

# Set up socket location
listen "#{shared_dir}/sockets/unicorn.sock", :backlog => 64

# Logging
stderr_path "#{shared_dir}/log/unicorn.stderr.log"
stdout_path "#{shared_dir}/log/unicorn.stdout.log"

# Set master PID location
pid "#{shared_dir}/pids/unicorn.pid"

保存して終了。 これにより、アプリケーションの場所、およびそのソケット、ログ、およびPIDの場所を使用してUnicornが構成されます。 ファイルを自由に変更するか、必要な他のオプションを追加してください。

次に、構成ファイルで参照されたディレクトリを作成します。

  1. mkdir -p shared/pids shared/sockets shared/log

UnicornInitスクリプトを作成する

Unicornを簡単に起動および停止し、起動時に確実に起動できるように、initスクリプトを作成しましょう。

スクリプトを作成し、次のコマンドで編集用に開きます(必要に応じて、強調表示された部分をアプリケーション名に置き換えます)。

  1. sudo vi /etc/init.d/unicorn_appname

次のコードブロックをコピーして貼り付け、USERAPP_NAME(強調表示)を適切な値に置き換えてください。

#!/bin/sh

### BEGIN INIT INFO
# Provides:          unicorn
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the unicorn app server
# Description:       starts unicorn using start-stop-daemon
### END INIT INFO

set -e

USAGE="Usage: $0 <start|stop|restart|upgrade|rotate|force-stop>"

# app settings
USER="deploy"
APP_NAME="appname"
APP_ROOT="/home/$USER/$APP_NAME"
ENV="production"

# environment settings
PATH="/home/$USER/.rbenv/shims:/home/$USER/.rbenv/bin:$PATH"
CMD="cd $APP_ROOT && bundle exec unicorn -c config/unicorn.rb -E $ENV -D"
PID="$APP_ROOT/shared/pids/unicorn.pid"
OLD_PID="$PID.oldbin"

# make sure the app exists
cd $APP_ROOT || exit 1

sig () {
  test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {
  test -s $OLD_PID && kill -$1 `cat $OLD_PID`
}

case $1 in
  start)
    sig 0 && echo >&2 "Already running" && exit 0
    echo "Starting $APP_NAME"
    su - $USER -c "$CMD"
    ;;
  stop)
    echo "Stopping $APP_NAME"
    sig QUIT && exit 0
    echo >&2 "Not running"
    ;;
  force-stop)
    echo "Force stopping $APP_NAME"
    sig TERM && exit 0
    echo >&2 "Not running"
    ;;
  restart|reload|upgrade)
    sig USR2 && echo "reloaded $APP_NAME" && exit 0
    echo >&2 "Couldn't reload, starting '$CMD' instead"
    $CMD
    ;;
  rotate)
    sig USR1 && echo rotated logs OK && exit 0
    echo >&2 "Couldn't rotate logs" && exit 1
    ;;
  *)
    echo >&2 $USAGE
    exit 1
    ;;
esac

保存して終了。 これにより、service unicorn_appnameを使用して、UnicornおよびRailsアプリケーションを開始および停止できます。

スクリプトの権限を更新し、Unicornが起動時に起動できるようにします。

  1. sudo chmod 755 /etc/init.d/unicorn_appname
  2. sudo update-rc.d unicorn_appname defaults

今すぐ始めましょう:

  1. sudo service unicorn_appname start

これで、Railsアプリケーションの本番環境はUnicornで実行され、shared/sockets/unicorn.sockソケットでリッスンしています。 外部ユーザーがアプリケーションにアクセスできるようにするには、Nginxリバースプロキシを設定する必要があります。

Nginxをインストールして構成する

apt-getを使用してNginxをインストールします。

  1. sudo apt-get install nginx

次に、テキストエディタでデフォルトのサーバーブロックを開きます。

  1. sudo vi /etc/nginx/sites-available/default

ファイルの内容を次のコードブロックに置き換えます。 強調表示された部分を適切なユーザー名とアプリケーション名に置き換えてください。

upstream app {
    # Path to Unicorn SOCK file, as defined previously
    server unix:/home/deploy/appname/shared/sockets/unicorn.sock fail_timeout=0;
}

server {
    listen 80;
    server_name localhost;

    root /home/deploy/appname/public;

    try_files $uri/index.html $uri @app;

    location @app {
        proxy_pass http://app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}

保存して終了。 これにより、Nginxがリバースプロキシとして構成されるため、HTTPリクエストはUnixソケットを介してUnicornアプリケーションサーバーに転送されます。 必要に応じて、自由に変更してください。

Nginxを再起動して、変更を有効にします。

  1. sudo service nginx restart

これで、Railsアプリケーションの本番環境にサーバーのパブリックIPアドレスまたはFQDNを介してアクセスできるようになりました。 以前に作成したタスクコントローラーにアクセスするには、Webブラウザーでアプリケーションサーバーにアクセスします。

http://server_public_IP/tasks

アプリケーションを最初にテストしたときに表示したのと同じページが表示されるはずですが、現在はNginxとUnicornを介して提供されています。

結論

おめでとう! NginxとUnicornを使用して、RubyonRailsアプリケーションの本番環境をデプロイしました。

本番環境のRailsアプリケーションのデプロイメントを改善したい場合は、Capistranoを使用してデプロイメントを自動化する方法に関するチュートリアルシリーズを確認する必要があります。 このシリーズはCentOSに基づいていますが、それでもデプロイメントの自動化に役立つはずです。

モバイルバージョンを終了