初心者プログラマのひとり勉強部屋

若葉マークのプログラマー☺️

【ruby on rails AWSデプロイ】AWSでのデプロイ〜UNICORN Nginx

何度もこんにちは!

今回はAWSのEC2サーバ設定終わりましたので、デプロイ関係に関する備忘録します。(2020.3.11)

 

AWSの無料枠

・EC2の解放(AWSの登録は省略します)

Linuxサーバの設定

アプリケーションサーバUnicorn設定 →今回はここ

・webサーバNginx設定 →今回はここ

------------

・【自動デプロイ】capistrano設定

・IAMユーザの登録

・S3(ストレージ)の設定

 

 

Unicorn設定(railsアプリのクローンから)

まずrailsアプリケーションをEC2にgit cloneするためにgithubssh鍵を登録します。

■(Git)ssh鍵の作成

(EC2上)$ ssh-keygen -t rsa //-tは鍵の形式でrsaを指定しています

デフォルトで「id_rsa

※途中聞かれるパスワードはなくてもOK

 

$ls /home/ec2-user/.sshにある「id_rsa.pub」が公開鍵です。

※$cat ~/.ssh/id_rsa.pub で内容をコピーします

ご自身のgithub→「setting」→「SSH and GPG key」より公開鍵の内容を登録します。

 

Unicorn(アプリケーションサーバ)の登録

ローカルからだと、「rails s」で動かしているものです。

・gemにunicorn追記

$gem 'unicorn'

※production環境にのみ追記

 

・config/unicorn.rbを作成

#railsのルートパスをいれておく
#_FILE_は現在のソースファイル名を返す
#File.expand_path('path', file)→pathを絶対パスにした文字列を返す
#【(後述)自動デプロイの設定のため】../を一つ増やしている
app_path = File.expand_path('../../../'__FILE__)

#ワーカー数の指定 多く設定すると処理が早くなる
worker_processes 1

#アプリケーションの設置されているディレクトリを指定
# 【(後述)自動デプロイの設定のため】currentディレクトリを指定
working_directory "#{app_path}/current"
 
#nginxとunkcornはsocketを利用して接続しているのでlistenは揃える必要あり,ということ
listen "#{app_path}/shared/tmp/sockets/unicorn.sock"
#pidファイルの場所を指定
pid "#{app_path}/shared/tmp/pids/unicorn.pid"
#ログファイルの場所を指定
stderr_path "#{app_path}/shared/log/unicorn.stderr.log"
stdout_path "#{app_path}/shared/log/unicorn.stdout.log"

#接続タイムアウト時間
timeout 60

 
#unicornの再起動時にダウンタイムなしで再起動
preload_app true
#効果ないらしいのでコメントアウトでもよし?
GC.respond_to?(:copy_on_write_friendly=&& GC.copy_on_write_friendly = true

#有効にするとunicornはアプリケーションを呼び出す前にHTTPヘッダをみてクライアント接続をチェック 
ループバックで接続する場合のみ有効
check_client_connection false

run_once = true
 
#fork前
#capistrano使用の際USR2でホットデプロイしている・その際古いプロセスを削除する記述
before_fork do |serverworker|
  defined?(ActiveRecord::Base&&
    ActiveRecord::Base.connection.disconnect!

  if run_once
    run_once = false
  end

#workerの古いプロセスを止める
  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(sigFile.read(old_pid).to_i)
    rescue Errno::ENOENTErrno::ESRCH => e
      logger.error e
    end
  end
end

after_fork do |_server_worker|
  defined?(ActiveRecord::Base&& ActiveRecord::Base.establish_connection
end

 

用語の備忘録

・USR2シグナル:Unicornを再起動するときUSR2シグナルを送る

capistranoではusr2シグナルを送って緩やかなデプロイをしている)

ホットデプロイデプロイ中もサービスを停止しないデプロイ

・fork:プロセスのコピーを生成すること

 

※参考にさせていただきました

fileパス

https://docs.ruby-lang.org/ja/latest/method/File/s/expand_path.html

unicornの設定について

https://qiita.com/syou007/items/555062cc96dd0b08a610

https://qiita.com/y_matsuwitter/items/e6019660b18f13ca8486

https://kray.jp/blog/troubleshooting-rails-unicorn/

 

■作成したrailsクローンについて 

・git clone

サーバにアプリケーションのフォルダを作成してクローンします。

 

・secret_key_baseを設定

簡単にいうとCookieの生成に必要のようで設定しないとエラーが出るようです。

秘密情報となるため環境変数として設定します。

環境変数の設定方法はrails5.1以下は[secret.yml]5.2からは[crediential.yml]と変更になっています。今回は5.2のため別記事で環境設定について記載します。

 

 

■Nginxのインストール・設定

(EC2上で実行します)

$ sudo yum install nginx

設定ファイル

/etc/nginx/conf.d/rails.conf をEC2上に作成します。

(デフォルトで別に設定ファイルがありますが、作成した方が良いようです。)

 

upstream app_server {

#unicornのsockets先と合わせる

  server unix:/【EC2のレポジトリpath】/shared/tmp/sockets/unicorn.sock;

}

 

server {

#carrirewaveを使用した際にファイルサイズの上限を超えたため拡張しました

  client_max_body_size 20M;

#listen 使用するIPアドレス・ポートを指定

  listen 80;

#listen ホスト名を指定

  server_name 54.64.○.○;

#root webサーバの最上位となるディレクトリ指定

  root /【レポジトリpath】/current/public;

 #location URLに応じた様々な設定を行う ^~は正規表現

  location ^~ /assets/ {

    gzip_static on;

    expires max;

    add_header Cache-Control public;

    root  /【EC2のレポジトリpath】/current/public;

  }

 

#try_files 静的なファイルと動的なファイルを振り分ける

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

 

  location @unicorn {

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header Host $http_host;

    proxy_redirect off;

    proxy_pass http://app_server;

  }

 

  error_page 500 502 503 504 /500.html;

}

 

用語の備忘録

http{ }、server{ }、location / {}:ディレクティブ

{ }内の記述:コンテキスト、そのかっこ内で有効

 

参考サイトさま

https://hack-le.com/nginx/

https://server-setting.info/centos/nginx-location-check.html

https://qiita.com/kaikusakari/items/cc5955a57b74d5937fd8

 

こちらで、unicornの設定とnginxの設定が完了しました。

次回はrailsの設定・unicornの起動・nginxの起動について記載します☺️

 

 

毎回勉強不足な点がありますがご了承くださいませ🙇‍♂️