背景
その①の続きからの手順。
その①
https://qiita.com/ren0826jam/items/76c826c3c4c5af3c525d
その③
https://qiita.com/ren0826jam/items/22153a9e3def565c93f6
手順
1.EC2サーバのSSH鍵ペアを作成する(ec2-userログイン状態で)
$ ssh-keygen -t rsa -b 4096
# 入力を求められるがエンターで進む
2.SSH公開鍵を表示しコピーする(ec2-userログイン状態で)
$ cat ~/.ssh/id_rsa.pub
3.GitHubに移動し、設定の「SSh and GPG keys」に移動する
4.SSHkeysにタイトルを入力し、公開鍵をコピーしたら保存する。
5.Gemfileに以下を記述する
group :production do
gem 'unicorn', '5.4.1'
end
忘れず実行する。
bundle install
6.config/unicorn.rbを作成し以下を記述する。
app_path = File.expand_path('../../', __FILE__)
# サーバ上でのアプリケーションコードが設置されているディレクトリを変数に入れておく
worker_processes 1
# アプリケーションサーバの性能を決定する
working_directory app_path
# アプリケーションの設置されているディレクトリを指定
pid "#{app_path}/tmp/pids/unicorn.pid"
# Unicornの起動に必要なファイルの設置場所を指定
listen 3000
# ポート番号を指定
stderr_path "#{app_path}/log/unicorn.stderr.log"
# エラーのログを記録するファイルを指定
stdout_path "#{app_path}/log/unicorn.stdout.log"
# 通常のログを記録するファイルを指定
timeout 60
# Railsアプリケーションの応答を待つ上限時間を設定
preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true
check_client_connection false
run_once = true
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
7.config/environments/production.rbの以下の記述をコメントアウトする
config.assets.js_compressor = :uglifier
8.GitHubにプッシュする
9./var/wwwディレクトリを作成し、権限をec2-userに変更する。(ec2-userログイン状態で)
$ sudo mkdir /var/www/
# mkdirコマンドで新たにディレクトリを作成
$ sudo chown ec2-user /var/www/
# 作成したwwwディレクトリの権限をec2-userに変更
10.GitHubから、「Clone or download」をクリックしURLをコピーする
11./var/www/に移動し、コードをクローンする。(ec2-userログイン状態で)
$ git clone コピーしたURL
12.以下の手順でスワップ領域をを用意する(ec2-userログイン状態で)
$ cd
# ホームディレクトリに移動
$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512
# 処理に時間がかかります
512+0 レコード入力
512+0 レコード出力
536870912 バイト (537 MB) コピーされました、 7.35077 秒、 73.0 MB/秒
# この様に表示されれば成功
$ sudo chmod 600 /swapfile1
$ sudo mkswap /swapfile1
スワップ空間バージョン1を設定します、サイズ = 524284 KiB
ラベルはありません, UUID=74a961ba-7a33-4c18-b1cd-9779bcda8ab1
# この様に表示されれば成功
$ sudo swapon /swapfile1
$ sudo sh -c 'echo "/swapfile1 none swap sw 0 0" >> /etc/fstab'
# 間が空いているがこの様に記述する
13.クローンしたリポジトリに移動する。(ec2-userログイン状態で)
14.ruby -v で、2.5.1と表示されているか確認(ec2-userログイン状態で)
$ ruby -v
15.bundler -v で、bundlerのバージョンを確認する(ローカル環境で)
$ bundler -v
16.本番環境用のbundlerをインストールし、bundle installする(ec2-userログイン状態で)
$ gem install bundler -v 確認したbundlerのバージョン
17.rake secret を実行して表示されたものをコピーする(ec2-userログイン状態で)
$ rake secret
18.sudo vim /etc/environment で環境変数を設定できる画面が出る。(ec2-userログイン状態で)
$ sudo vim /etc/environment
19.iを押すと入力モードになるため以下を記述
DATABASE_PASSWORD='MySQLのrootユーザーのパスワード'
SECRET_KEY_BASE='先程コピーしたsecret_key_base'
20.escキーで戻り、:wqを入力して保存します
21.環境変数を適用させるため一旦ec2-userをログアウトし、再びログインする
22.環境変数が適用されているか以下の手順で確認する
$ env | grep SECRET_KEY_BASE
# SECRET_KEY_BASE='secret_key_base'
$ env | grep DATABASE_PASSWORD
# DATABASE_PASSWORD='MySQLのrootユーザーのパスワード'
23.EC2インスタンスの選択画面で対象のインスタンスを選択し、セキュリティグループのリンクを選択
24.「インバウンド」→「編集」をクリック
25.モーダルが開き、ルールを追加をクリックし下記の条件を設定し保存する
タイプを「カスタムTCPルール」、プロトコルを「TCP」、ポート範囲を「3000」、送信元を「カスタム」「0.0.0.0/0」に設定
26.以下の手順でユニコーンを起動する(ec2-userログイン状態で)
$ cd /var/www/リポジトリ
$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
27.database.ymlを以下のように記述する(下3行が追記部分)
production:
<<: *default
database: # それぞれのアプリケーション名によって異なる。これは編集しない
username: root
password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
28.GitHubにプッシュする
29.ec2-userログイン状態で現在のリポジトリに移動してから、プルする
$ git pull origin master
30.データベースを作成しマイグレーションを実行する(ec2-userログイン状態で)
$ rails db:create RAILS_ENV=production
$ rails db:migrate RAILS_ENV=production
# 上記でエラーが出る場合はMySQLが起動してない可能性があるため起動する
31.Railsを起動する(ec2-userログイン状態で)
$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
32.アセットコンパイルを実行する
$ rails assets:precompile RAILS_ENV=production
33.Unicornのプロセスを確認する
$ ps aux | grep unicorn
34.Unicornのプロセスを停止する
$ kill <確認したunicorn rails masterのPID>
35.Unicornが停止されているか確認する
$ ps aux | grep unicorn
36.再度Unicornを起動する
$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
37.ブラウザで、http://<Elastic IP>:3000/にアクセスして確認
38.Nginxをインストールする(ec2-userログイン状態で)
$ sudo yum -y install nginx
39.rails.confファイルをvimで開く(ec2-userログイン状態で)
$ sudo vim /etc/nginx/conf.d/rails.conf
40.iを押すと入力モードになるため下記を記述し、保存する。(:wq)
upstream app_server {
server unix:/var/www/<アプリケーション名>/tmp/sockets/unicorn.sock;
}
server {
listen 80;
server_name <Elastic IP>;
client_max_body_size 2g;
root /var/www/<アプリケーション名>/public;
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;
}
41.nginxの権限を変更(ec2-userログイン状態で)
$ cd /var/lib
$ sudo chmod -R 775 nginx
42.Nginxを再起動して設定ファイルを再読み込みする(ec2-userログイン状態で)
$ cd ~
$ sudo service nginx restart
43.unicorn.rbの記述を変更する
listen 3000
# ↓以下のように修正
listen "#{app_path}/tmp/sockets/unicorn.sock"
44.GitHubにプッシュする
45.ローカルの変更点を本番環境へ反映させる
$ cd /var/www/リポジトリ名
$ git pull origin master
46.Unicornを再起動させる
$ ps aux | grep unicorn
$ kill <確認したunicorn rails masterのPID>
$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
47.ブラウザで確認する(Elastic IPでアクセス)