実践で学ぶRuby on rails 〜仮説千本ノック〜

プログラマーとして独立するため日々スキルアップに励んでいます。優れたプログラマは仮説を立てるのがうまい。そこを目指して仮説を立てては検証する日々です!!

AWSを使ったデプロイ~unicorn設定・コードのコピー~

アプリケーションサーバとは、ブラウザからのリクエストを受付、実際にRailsアプリを動作させるソフトウェアのこと。

ローカルでrails sコマンドで起動していたのが、pumaというアプリケーションサーバ

アプリケーションサーバーが動いていれば、ブラウザからのリクエスエストを受け付けて、Railsアプリケーションが動作する。

EC2でも、同じ理由で、アプリケーションサーバが必要となる。

よく使われるのがUnicornをいうサーバ。

unicorn_rails コマンドで起動できる。

 

アプリケーションサーバUnicorn」のインストール

 UnicornRubyで作成されており、gemとなっているので、ローカルのGemfileの本番環境に記述して、bundleする。

開発環境、テスト環境では不要なので、group :production do~endにのみ記述する事。

group :production do
  gem 'unicorn', '5.4.1'
end

configディレクトリにunicorn.rbを作成、unicornの設定を行う。

#サーバ上でのアプリケーションコードが設置されているディレクトリを変数に入れておく。unicorn.rbの親の親ディレクトリがアプリディレクトリとなっている場合。
app_path = File.expand_path('../../', __FILE__)

#アプリケーションサーバの性能を決定するメモリが許す限り増やした方が処理が早くなる。
worker_processes 1

#アプリケーションの設置されているディレクトリを指定
working_directory app_path

#Unicornの起動に必要なファイルが作成されるため、保存先を指定
pid "#{app_path}/tmp/pids/unicorn.pid"

#ポート番号を指定
listen 3000

#エラーのログを記録するファイルを指定
stderr_path "#{app_path}/log/unicorn.stderr.log"

#通常のログを記録するファイルを指定
stdout_path "#{app_path}/log/unicorn.stdout.log"

#Railsアプリケーションの応答を待つ上限時間を設定
timeout 60

#以下は応用的な設定なので説明は割愛
# 基本的にtrueを選択する。
更新時にダウンタイムがなくなる。(更新したタイミングでサービスが一瞬落ちてしまうことがなくなる)
これにより実際に呼ばれるのはbuild_app!メソッドである。 preload_app true GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true
unicornが、限定したクライアントだけに限定されているのかチェック check_client_connection false run_once = true
#再起動時に古いプロセスを削除してくれる。
#before_forkには、はmasterがworkerを作る直前に実行したい処理を登録する。 before_fork do |server, worker| defined?(ActiveRecord::Base) && ActiveRecord::Base.connection.disconnect! if run_once run_once = false # prevent from firing again end old_pid = "#{server.config[:pid]}.oldbin" if File.exist?(old_pid) && server.pid != old_pid begin sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU Process.kill(sig, File.read(old_pid).to_i) rescue Errno::ENOENT, Errno::ESRCH => e logger.error e end end end after_fork do |_server, _worker| defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection end

 

デプロイエラーの原因となりうるものを取り除く

▫️JavaScript軽量化gem「Uglifier」のコメントアウト

このgemはJavaScript軽量化のためのものですが、Javascriptのテンプレートリテラル記法  「`」に対応しておらずエラーを引き起こす可能性があるため、本番環境の設定からコメントアウトする。

config/environments/production.rb 下の記述をコメントアウト

config.assets.js_compressor = :uglifier

今回の記事で行った変更は、ローカルで行っているので、リモートリポジトリのmasterブランチへプッシュしておきましょう。

 

これで、アプリのコードをEC2インスタンスにコピーする準備が整いました。

 

GithubからコードをEC2へクローン

 EC2内に、Githubからコピーしたコードを保存するwwwディレクトリを作成し、ディレクトリの所有者をec2-userに設定する。

[ec2-user@ip-172-31-23-189 ~]$ sudo mkdir /var/www/
#作成したwwwディレクトリの権限をec2-userに変更
[ec2-user@ip-172-31-23-189 ~]$ sudo chown ec2-user /var/www/

 

wwwディレクトリへ移動し、コードをクローンする

[ec2-user@ip-172-31-23-189 ~]$ cd /var/www/
[ec2-user@ip-172-31-23-189 www]$ git clone https://github.com/<ユーザー名>/<リポジトリ名>.git