前書き
Ruby on Railsアプリケーションをデプロイする準備ができたら、考慮すべき多くの有効なセットアップがあります。 このチュートリアルは、Ubuntu 14.04でPumaとNginxを使用して、PostgreSQLをデータベースとして使用して、Ruby on Railsアプリケーションの運用環境を展開するのに役立ちます。
Pumaはhttps://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-passenger-and-nginx-on-ubuntu-14-04[Passenger]のようなアプリケーションサーバーです。 ]またはhttps://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-unicorn-and-nginx-on-ubuntu-14-04[Unicorn]は、リクエストを同時に処理するRailsアプリケーション。 Pumaはユーザーが直接アクセスするようには設計されていないため、ユーザーとRailsアプリケーション間のリクエストとレスポンスをバッファリングするリバースプロキシとしてNginxを使用します。
前提条件
このチュートリアルでは、アプリケーションをデプロイするユーザーに、次のソフトウェアがインストールされたUbuntu 14.04サーバーがあることを前提としています。
まだセットアップしていない場合は、上記にリンクされているチュートリアルに従ってください。 ユーザーは* deploy *と呼ばれると仮定します。
また、このチュートリアルでは、開発環境またはテスト環境のセットアップ方法については説明しません。 それに関するヘルプが必要な場合は、https://www.digitalocean.com/community/tutorials/how-to-use-postgresql-with-your-ruby-on-rails-application-on-ubuntu-の例に従ってください14-04 [PostgreSQL with Railsチュートリアル]。
Railsアプリケーションを作成する
理想的には、デプロイしたいRailsアプリケーションがすでに存在します。 この場合、このセクションをスキップして、適切な置換を行ってください。 そうでない場合、最初のステップは、PostgreSQLをデータベースとして使用する新しいRailsアプリケーションを作成することです。
このコマンドは、PostgreSQLをデータベースとして使用する「appname」という名前の新しいRailsアプリケーションを作成します。 強調表示された「アプリ名」を別のものに置き換えてください。
rails new -d postgresql
次に、アプリケーションディレクトリに移動します。
cd
Railsアプリケーションの本番環境で使用されるPostgreSQLユーザーを作成してみましょう。
実稼働データベースユーザーの作成
物事を簡単にするために、運用データベースユーザーにアプリケーション名と同じ名前を付けましょう。 たとえば、アプリケーションの名前が「appname」の場合、次のようなPostgreSQLユーザーを作成する必要があります。
sudo -u postgres createuser -s
データベースユーザーのパスワードを設定したいので、次のようにPostgreSQLコンソールを入力します。
sudo -u postgres psql
次に、データベースユーザーのパスワード(この例では「appname」)を次のように設定します。
\password
希望のパスワードを入力して確認します。
次のコマンドでPostgreSQLコンソールを終了します。
\q
これで、適切なデータベース接続情報を使用してアプリケーションを構成する準備が整いました。
データベース接続の構成
アプリケーションのルートディレクトリ( + cd〜/ +
)にいることを確認します。
お気に入りのテキストエディターでアプリケーションのデータベース構成ファイルを開きます。 viを使用します。
vi config/database.yml
`+ production`セクションを更新して、次のようにします。
production:
<<: *default
host: localhost
adapter: postgresql
encoding: utf8
database:
pool: 5
username: <%= ENV['_DATABASE_USER'] %>
password: <%= ENV['_DATABASE_PASSWORD'] %>
データベースのユーザー名とパスワードは、環境変数 `+ _DATABASE_USER `と ` _DATABASE_PASSWORD +`によって読み取られるように設定されていることに注意してください。 Gitなどの分散バージョン管理システムを使用している場合は簡単に公開される可能性があるため、本番用のパスワードとシークレットをアプリケーションコードベースの外部に保管することをお勧めします。 次に、環境変数を使用してデータベース認証を設定する方法について説明します。
保存して終了。
rbenv-varsプラグインをインストールする
実動Railsアプリケーションをデプロイする前に、環境変数を使用して実動秘密鍵とデータベースパスワードを設定する必要があります。 実行時にパスワードとシークレットをアプリケーションに読み込むために使用できる環境変数を管理する簡単な方法は、* rbenv-vars *プラグインを使用することです。
rbenv-varsプラグインをインストールするには、単純に `+ .rbenv / plugins +`ディレクトリに移動し、GitHubから複製します。 たとえば、rbenvがホームディレクトリにインストールされている場合、次のコマンドを実行します。
cd ~/.rbenv/plugins
git clone https://github.com/sstephenson/rbenv-vars.git
環境変数を設定する
rbenv-varsプラグインがインストールされたので、必要な環境変数を設定しましょう。
最初に、署名されたCookieの整合性を検証するために使用される秘密鍵を生成します。
cd ~/appname
rake secret
生成された秘密鍵をコピーしてから、お気に入りのエディターで `+ .rbenv-vars +`ファイルを開きます。 viを使用します。
vi .rbenv-vars
ここで設定した環境変数は、Railsアプリケーションで読み取ることができます。
最初に、 `+ SECRET_KEY_BASE +`変数を次のように設定します(強調表示されたテキストを、生成およびコピーしたばかりのシークレットに置き換えます):
SECRET_KEY_BASE=
次に、 `+ _DATABASE_USER +`変数を次のように設定します(強調表示された「APPNAME」をアプリケーション名に、「appname」を本番データベースのユーザー名に置き換えます):
_DATABASE_USER=
最後に、次のように `+ _DATABASE_PASSWORD +`変数を設定します(強調表示された「APPNAME」をアプリケーション名に、「prod_db_pass」を本番データベースのユーザーパスワードに置き換えます):
_DATABASE_PASSWORD=
保存して終了。
次のコマンドを実行すると、rbenv-varsプラグインを使用して、アプリケーションに設定されている環境変数を表示できます。
rbenv vars
シークレットパスワードまたはデータベースパスワードを変更する場合は、 `+ .rbenv-vars +`ファイルを更新します。 このファイルを非公開にして、公開コードリポジトリを含めないように注意してください。
本番データベースを作成する
アプリケーションがPostgreSQLデータベースと通信するように構成されたので、実稼働データベースを作成しましょう。
RAILS_ENV=production rake db:create
コントローラーを生成する
例に沿ってフォローしている場合は、scaffoldコントローラーを生成して、アプリケーションに何かを見てもらいます。
rails generate scaffold Task title:string note:text
次のコマンドを実行して、運用データベースを更新します。
RAILS_ENV=production rake db:migrate
アセットもプリコンパイルする必要があります。
RAILS_ENV=production rake assets:precompile
アプリケーションが機能するかどうかをテストするには、実稼働環境を実行し、サーバーのパブリックIPアドレスにバインドします(サーバーのパブリックIPアドレスを置き換えます)。
RAILS_ENV=production rails server --binding=
次に、WebブラウザーでこのURLにアクセスします。
http://:3000/tasks
正常に機能している場合、次のページが表示されます。
image:https://assets.digitalocean.com/articles/rails_unicorn/tasks.png [タスクコントローラー]
Railsサーバーに戻り、 `+ Ctrl-c +`を押してアプリケーションを停止します。
Pumaをインストールする
これで、Pumaをインストールする準備ができました。
これを行う簡単な方法は、アプリケーションの `+ Gemfile +`に追加することです。 お気に入りのエディターでGemfileを開きます(アプリケーションのルートディレクトリにいることを確認してください)。
vi Gemfile
ファイルの最後に、次の行でPuma gemを追加します。
gem 'puma'
保存して終了。
Pumaおよび未解決の依存関係をインストールするには、Bundlerを実行します。
bundle
Pumaがインストールされましたが、設定する必要があります。
プーマを構成する
Pumaを構成する前に、サーバーのCPUコアの数を調べる必要があります。 次のコマンドを使用して簡単に実行できます。
grep -c processor /proc/cpuinfo
それでは、Pumaの設定を `+ config / puma.rb +`に追加しましょう。 テキストエディターでファイルを開きます。
vi config/puma.rb
この構成をコピーしてファイルに貼り付けます。
# Change to match your CPU core count
workers
# Min and Max threads per worker
threads 1, 6
app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"
# Default to production
rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env
# Set up socket location
bind "unix://#{shared_dir}/sockets/puma.sock"
# Logging
stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true
# Set master PID and state locations
pidfile "#{shared_dir}/pids/puma.pid"
state_path "#{shared_dir}/pids/puma.state"
activate_control_app
on_worker_boot do
require "active_record"
ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
end
`+ workers +`の数をサーバーのCPUコアの数に変更します。
保存して終了。 これにより、アプリケーションの場所と、ソケット、ログ、およびPIDの場所でPumaが構成されます。 ファイルを自由に変更するか、必要な他のオプションを追加してください。
次に、構成ファイルで参照されたディレクトリを作成します。
mkdir -p shared/pids shared/sockets shared/log
Puma Upstartスクリプトを作成する
Upstart initスクリプトを作成して、Pumaを簡単に起動および停止し、起動時に確実に起動できるようにします。
Jungle UpstartツールをPuma GitHubリポジトリからホームディレクトリにダウンロードします。
cd ~
wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma-manager.conf
wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma.conf
提供された `+ puma.conf +`ファイルを開いて、Pumaデプロイメントユーザーを設定します。
vi puma.conf
`+ setuid `と ` setgid +`を指定する2行を探し、「apps」を展開ユーザーとグループの名前に置き換えます。 たとえば、展開ユーザーが「展開」と呼ばれる場合、行は次のようになります。
setuid
setgid
保存して終了。
次に、スクリプトをUpstartサービスディレクトリにコピーします。
sudo cp puma.conf puma-manager.conf /etc/init
`+ puma-manager.conf `スクリプトは、管理するアプリケーションの ` / etc / puma.conf +`を参照します。 そのインベントリファイルを作成して編集しましょう。
sudo vi /etc/puma.conf
このファイルの各行は、 `+ puma-manager +`で管理したいアプリケーションへのパスでなければなりません。 ここでアプリケーションにパスを追加します。 例えば:
/home//
保存して終了。
これで、Upstartを使用して、起動時にアプリケーションが起動するように設定されました。 これは、サーバーを再起動した後でもアプリケーションが起動することを意味します。
Pumaアプリケーションを手動で開始する
すべての管理対象Pumaアプリを今すぐ起動するには、次のコマンドを実行します。
sudo start puma-manager
次のように、 + puma +
Upstartスクリプトを使用して、単一のPumaアプリケーションを起動することもできます。
sudo start puma app=/home//
次のように、 + stop`と
+ restart`を使用してアプリケーションを制御することもできます。
sudo stop puma-manager
sudo restart puma-manager
これで、Railsアプリケーションの本番環境がPumaで実行され、 `+ shared / sockets / puma.sock`ソケットをリッスンしています。 外部ユーザーがアプリケーションにアクセスできるようにするには、Nginxリバースプロキシを設定する必要があります。
Nginxのインストールと構成
apt-getを使用してNginxをインストールします。
sudo apt-get install nginx
次に、デフォルトのサーバーブロックをテキストエディターで開きます。
sudo vi /etc/nginx/sites-available/default
ファイルの内容を次のコードブロックに置き換えます。 強調表示された部分を適切なユーザー名とアプリケーション名(2つの場所)に置き換えてください:
upstream app {
# Path to Puma SOCK file, as defined previously
server unix:/home///shared/sockets/puma.sock fail_timeout=0;
}
server {
listen 80;
server_name localhost;
root /home///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ソケットを介してPumaアプリケーションサーバーに転送されます。 必要に応じて自由に変更を加えてください。
Nginxを再起動して、変更を有効にします。
sudo service nginx restart
これで、サーバーのパブリックIPアドレスまたはFQDNを介してRailsアプリケーションの運用環境にアクセスできます。 前に作成したタスクコントローラーにアクセスするには、Webブラウザーでアプリケーションサーバーにアクセスします。
http:///tasks
アプリケーションを初めてテストしたときと同じページが表示されるはずですが、現在はNginxとPumaを介して提供されています。
結論
おめでとうございます。 NginxとPumaを使用して、Ruby on Railsアプリケーションの運用環境を展開しました。
実動Railsアプリケーションのデプロイメントを改善したい場合は、https://www.digitalocean.com/community/tutorial_series/how-to-use-capistrano-to-automate-deployments [How To]のチュートリアルシリーズを確認してください。 Capistranoを使用して展開を自動化する]。 このシリーズはCentOSに基づいていますが、それでもデプロイメントの自動化に役立つはずです。