AWSを用いたデプロイの流れ(3)

甘党エンジニアのkanjiです。

前回に引き続き、AWSを用いたデプロイ・本番環境の構築の流れついて順を追って書いていく。

第2弾で「開発したアプリケーションを全世界に公開(デプロイ)する手順」を書いた。

AWSを用いたデプロイの流れ(2)

今回は第2弾の手順を一瞬で終わらせる「自動デプロイ」をするための設定についてまとめていく。
(ようやく最後です)

Nginxの導入と設定

Nginx(エンジン・エックス)とは?
Webサーバの一種。ユーザーのリクエストに対して静的コンテンツの取り出し処理を行い、そして動的コンテンツの生成をアプリケーションサーバに依頼する役割を持つ。

ターミナルで以下のコマンドを実行し、Nginxをインストールする。

[ec2-user@ip-555-432-111 ~]$ sudo yum install nginx

続いて、Nginxの設定ファイルをvimコマンドを使って編集する

[ec2-user@ip-555-432-111 ~]$ sudo vim /etc/nginx/conf.d/rails.conf

ターミナル上でファイルを開けたら次のように編集する。

「Elastic IP」「アプリケーション名」は各個人のものに変更する。

upstream app_server {
  # Unicornと連携させるための設定。アプリケーション名を自身のアプリ名に書き換えることに注意。今回であればおそらくchat-space
  server unix:/var/www/<アプリケーション名>/tmp/sockets/unicorn.sock;
}

# {}で囲った部分をブロックと呼ぶ。サーバの設定ができる
server {
  # このプログラムが接続を受け付けるポート番号
  listen 80;
  # 接続を受け付けるリクエストURL ここに書いていないURLではアクセスできない
  server_name ;

# 接続が来た際のrootディレクトリ
  root /var/www/<アプリケーション名>/public;

# assetsファイル(CSSやJavaScriptのファイルなど)にアクセスが来た際に適用される設定
  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  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;
}

設定が完了したら、POSTメソッドでもエラーが出ないようにするために、下記コマンドを実行する。

[ec2-user@ip-555-432-111 ~]$ cd /var/lib
[ec2-user@ip-555-432-111 lib]$ sudo chmod -R 775 nginx
POSTメソッドとは?
HTTP通信でクライアントからWebサーバへ送るリクエストの種類の一つで、URLで指定したプログラムなどに対してクライアントからデータを送信するためのもの。

最後に、Nginxを再起動して設定ファイルを再読み込みする。

[ec2-user@ip-555-432-111 ~]$ sudo service nginx restart

unicornの設定を修正

以下のようにunicorn.rbを修正する。

listen 3000

↓以下のように修正

listen "#{app_path}/tmp/sockets/unicorn.sock"

サーバ側で以下のコマンドを実行して修正点を反映させる。

[ec2-user@ip-555-432-111 <リポジトリ名>]$ git pull origin master

ここまで完了したら、ブラウザからElastic IPで、アプリケーションにアクセスできるようになる(:3000不要)。
unicornは起動させておく必要がある。

Capistranoの導入

Capistranoとは?
自動デプロイツールの一種で、これによりデプロイ時に必要なコマンド操作が1回で済むようになる。
config.assets.js_compressor = :uglifier

#コメントアウト config.assets.js_compressor = :uglifier

Capistranoを利用するためのGemをインストールする。

group :development, :test do
  gem 'capistrano'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano3-unicorn'
end

gem読み込み+下記のコマンドを打ち込む。

bundle install
bundle exec cap install

下記ファイルが生成される。

アプリケーション名
capfile
config
-deploy
-production.rb
-staging.rb
deploy.rb
lib
-capistrano
-tasks

Capfileを下記のように編集する。

require "capistrano/setup"
require "capistrano/deploy"
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano3/unicorn'

Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

production.rbを下記のように編集する。

server '<用意したElastic IPを入力>', user: 'ec2-user', roles: %w{app db web}

こんな感じになればOK→
server '12.345.67.890', user: 'ec2-user', roles: %w{app db web}

deploy.rbを下記のように編集する。

# config valid only for current version of Capistrano
# capistranoのバージョンを記載。固定のバージョンを利用し続け、バージョン変更によるトラブルを防止する。
lock '<Capistranoのバージョン>'

# Capistranoのログの表示に利用する
set :application, '自身のアプリケーション名'

# どのリポジトリからアプリをpullするかを指定する
set :repo_url,  'git@github.com:<Githubのユーザー名>/<レポジトリ名>.git'

# バージョンが変わっても共通で参照するディレクトリを指定
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')

set :rbenv_type, :user
set :rbenv_ruby, '<このアプリで使用しているrubyのバージョン>' #カリキュラム通りに進めた場合、2.5.1か2.3.1です

# どの公開鍵を利用してデプロイするか
set :ssh_options, auth_methods: ['publickey'],
                  keys: ['<ローカルPCのEC2インスタンスのSSH鍵(pem)へのパス>']  ※例:~/.ssh/key_pem.pem

# プロセス番号を記載したファイルの場所
set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" }

# Unicornの設定ファイルの場所
set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" }
set :keep_releases, 5

# デプロイ処理が終わった後、Unicornを再起動するための記述
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  task :restart do
    invoke 'unicorn:restart'
  end
end
lock ''
capistranoのバージョンは、gemfile.lockから確認できる。(capistrano (3.11.0)など)

config/unicorn.rbを下記のように編集する。

 

app_path = File.expand_path('../../', __FILE__)

worker_processes 1

working_directory app_path
pid "#{app_path}/tmp/pids/unicorn.pid"
listen "#{app_path}/tmp/sockets/unicorn.sock"
stderr_path "#{app_path}/log/unicorn.stderr.log"
stdout_path "#{app_path}/log/unicorn.stdout.log"

 ↓↓↓↓↓↓↓ 以下のように変更 ↓↓↓↓↓↓

# ../が一つ増えている
app_path = File.expand_path('../../../', __FILE__)

worker_processes 1
# currentを指定
working_directory "#{app_path}/current"

# それぞれ、sharedの中を参照するよう変更
listen "#{app_path}/shared/tmp/sockets/unicorn.sock"
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"

Nginxの設定ファイルの記述を編集する。

$ sudo vim /etc/nginx/conf.d/rails.conf
upstream app_server {
  server unix:/var/www/<アプリケーション名>/tmp/sockets/unicorn.sock;
}
      
 ↓↓↓↓↓↓↓ 以下のように変更 ↓↓↓↓↓↓

upstream app_server {
  server unix:/var/www/<アプリケーション名>/shared/tmp/sockets/unicorn.sock;
}
root /var/www/<アプリケーション名>/public;
      
 ↓↓↓↓↓↓↓ 以下のように変更 ↓↓↓↓↓↓

root /var/www/<アプリケーション名>/current/public;
      
location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }
      
 ↓↓↓↓↓↓↓ 以下のように変更 ↓↓↓↓↓↓

location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    root   /var/www/<アプリケーション名>/current/public;
  }      
      

Nginxの設定を変更したら再読込・再起動を行う。

[ec2-user@ip-555-432-111 ~]$ sudo service nginx reload
[ec2-user@ip-555-432-111 ~]$ sudo service nginx restart

MySQLの起動を確認する。

[ec2-user@ip-555-432-111 ~]$ sudo service mysqld restart

unicornのコマンドをkillする。

[ec2-user@ip-555-432-111 ~]$ cd /var/www/<アプリ名>
[ec2-user@ip-555-432-111 <アプリ名>]$ kill -QUIT `cat tmp/pids/unicorn.pid`  #Unicornの停止

ローカルでの修正を全てmasterにpushする。

自動デプロイを実行する

以下のコマンドで自動デプロイする。

# アプリケーションのディレクトリで実行する
$ bundle exec cap production deploy

エラーが表示されずに完了したら自動デプロイは完了。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です