RailsアプリをAWS EC2にデプロイする方法その④デプロイ編②

AWSを使って本番環境にデプロイさせたので今回はその方法を簡潔に分かりやすく4段階にわけて書いて行きます。

1・下準備編

RailsアプリをAWS EC2にデプロイする方法その①下準備編 - 21歳フリーターからrailsエンジニアになるまで

2・DB.サーバー構築編

RailsアプリをAWS EC2にデプロイする方法その②DB.サーバー構築編 - 21歳フリーターからrailsエンジニアになるまで

3・デプロイ編①

RailsアプリをAWS EC2にデプロイする方法その③デプロイ編① - 21歳フリーターからrailsエンジニアになるまで

4・デプロイ編②⇦今回ここ

RailsアプリをAWS EC2にデプロイする方法その③デプロイ編② - 21歳フリーターからrailsエンジニアになるまで

 

いよいよ最後だ!!!!!

頑張っていこう!!!!

 

11・Unicornの設定

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 

Unicornとはアプリケーションサーバーの一種です。
アプリ本体を格納するためのサーバーです。

早速インストールしていきましょう。
下記コマンドを実行して下さい。

[seiya|CHARME] $: vi Gemfile

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

#以下を追記

group :production, :staging do

    gem 'unicorn'

end

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

[seiya|CHARME] $ gem install bundler

[seiya|CHARME] $ bundle install

[seiya|CHARME] $ vi config/unicorn.conf.rb

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

 viコマンドでconfig配下に生成したunicornの設定ファイルに、下記を記述します。

$worker  = 2

  $timeout = 150

  $app_dir = "/var/www/rails/CHARME" (自分のアプリ名)

  $listen  = File.expand_path '/var/run/unicorn.sock', $app_dir

  $pid     = File.expand_path '/var/run/unicorn.pid', $app_dir

  $std_log = File.expand_path 'log/unicorn.log', $app_dir

  # set config

  worker_processes  $worker

  working_directory $app_dir

  stderr_path $std_log

  stdout_path $std_log

  timeout $timeout

  listen  $listen

  pid $pid

  # loading booster

  preload_app true

  # before starting processes

  before_fork do |server, worker|

    defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!

    old_pid = "#{server.config[:pid]}.oldbin"

    if old_pid != server.pid

      begin

        Process.kill "QUIT", File.read(old_pid).to_i

      rescue Errno::ENOENT, Errno::ESRCH

      end

    end

  end

  # after finishing processes

  after_fork do |server, worker|

    defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection

  end

 深追いはしませんがハマったポイントは参考にしていた記事はunicorn.sockとpidをtmp以下にセットしていましたがこれだとどうやらうまく読み込んでくれないみたいなので

var/run/下にセットしました!

 

12・Nginxの設定

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

NginxはWebサーバーにあたります。
これも先ほど出てきましたね。受付窓口です。

早速下記コマンドを打ち込んでください。

[seiya|~] sudo yum install nginx

[seiya|~]$ cd /etc/nginx/conf.d/

[seiya|conf.d]$ sudo vi CHARME.conf #自分のアプリケーション名でファイル名変更 

 viコマンドで作成したnginxの設定ファイルには、下記を記述します。

error_log  /var/www/rails/CHARME/log/nginx.error.log; #自分のアプリケーション名に変更

access_log /var/www/rails/CHARME/log/nginx.access.log; #自分のアプリケーション名に変更

# max body size

client_max_body_size 2G;

upstream app_server {

  # for UNIX domain socket setups

  server unix:/var/run/unicorn.sock fail_timeout=0; #自分のアプリケーション名に変更

}

server {

  listen 80;

  server_name 54.95.23.50;

  # nginx so increasing this is generally safe...

  keepalive_timeout 5;

  # path for static files

  root /var/www/rails/CHARME/public; #自分のアプリケーション名に変更

  # page cache loading

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

  location @app_server {

    # HTTP headers

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header Host $http_host;

    proxy_redirect off;

    proxy_connect_timeout      360;

    proxy_send_timeout         360;

    proxy_read_timeout         360;

    proxy_pass http://app_server;

  }

  # Rails error pages

  error_page 500 502 503 504 /500.html;

  location = /500.html {

    root /var/www/rails/CHARME/public; #自分のアプリケーション名に変更

  }

} 

 ここでハマったポイントが1つあります。

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

  location @app_server {

 ここの@app_serverは上記の上から7行目でセットしたupstreamの名前に@をつけたものになりますのでご注意を!!(参考したサイトがそうなっておらずハマりまくりました笑)

また、設定ファイルの記述が終わったら、下記も実行してください。

[seiya|conf.d] cd /var/lib

[seiya|lib] sudo chmod -R 775 nginx

 この呪文はpostメソッドでもエラーが出ないようにするためのものなのだとか。
「開けごま」的な勢いでとりあえず唱えてあげましょう。

これにて設定は完了です!!

 

13・MySQLの設定

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

続いてDBです。
(アプリケーションのDBがMySQLで作成されている前提で話を進めていきます。)

下記コマンドを打ち込み、MySQLに関する設定を変更していきましょう。

[seiya|CHARME]$ vi config/database.yml

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

  production:

    <<: *default

    database: CHARME_production

    username: root #ここをrootに変更する

  password:      #ここを空欄にする

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

 

[seiyai|CHARME]$ sudo service mysqld start #mysqldの起動

[seiyai|CHARME]$ ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

[seiyai|CHARME]$ rake db:create RAILS_ENV=production

[seiyai|CHARME]$ rake db:migrate RAILS_ENV=production

f:id:yamasey712:20191012175140p:plain

上記のように、
アプリのmigrationファイルが実行されたログが出て来れば無事成功です!!

 

14・Nginxの起動

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


 先ほど設定したNginxを起動させましょう。
使うはたった1行のコマンド。

[seiya|CHARME]$ sudo service nginx start

 これだけなんです!!(涙)

 

15・確認するぞ!!!!!

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

ついにここまできた。

アクセスしてみよう。。(手汗すごい)

52.64.~~~~~~~~~(ご自身のIPアドレス)

 

f:id:yamasey712:20191012175523p:plain

って、え??????(3度見はした)

まさに夢ならば〜どれほど〜よかったでしょう。ですね(涙)

よし、夢では終わらせないためにまずは、Unicornの起動確認。

[seiya]$ ps -ef | grep unicorn | grep -v grep

 このコマンドを打ち込んで、

seiya  24265     1 27 03:12 ?        00:00:01 unicorn_rails master -c /var/www/rails/tech-ruche/config/unicorn.conf.rb -D -E production

seiya  24271 24265  0 03:12 ?        00:00:00 unicorn_rails worker[0] -c /var/www/rails/tech-ruche/config/unicorn.conf.rb -D -E production

seiya  24273 24265  0 03:12 ?        00:00:00 unicorn_rails worker[1] -c /var/www/rails/tech-ruche/config/unicorn.conf.rb -D -E production

こんな感じでなんだかゴニョゴニョ表示されていれば既に起動されています。
表示されない場合は下記を実行してください。

[seiya]$ unicorn_rails -c /var/www/rails/CHARME(アプリの名前)/config/unicorn.conf.rb -D -E production #unicornを起動させる

 

その後もう一度上記の起動確認コマンドを実行し、例のゴニョゴニョが出て来ればOKです。

その後、Nginxも再起動させます。

[seiya|CHARME]$ sudo nginx -s reload

 これでもう一度アクセスしてみてください!!
アプリが表示されましたか?

ちなみに僕の場合これをやってもさっきのエラー画面のままうんともすんとも言わず3日ぐらい積みました(涙)

 

そんな3日の闇を解決してくれたのがこのコマンドでした!!

1.unicornの停止

2.rails assets:precompile RAILS_ENV=production の実行

3.unicornの再起動(上記コマンド)

 この2のコマンドのおかげで無事デプロイすることができました!!!

本番環境に自分のアプリが映った時は嬉しすぎて泣きそうでした!!笑

 

最後に

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

皆さんも無事にデプロイできましたか??

これは僕みたいに勉強中の人たちのやくに少しでも役にたてたらいいなと思い書きました!!

何か質問などございましたらお気軽にどうぞ!!

ご連絡ございましたらメールかtwitterにてどうぞ!!

メールアドレス:yamasey_guchi@icloud.com

teittwr:https://twitter.com/yamasey712