AWSサーバーのデプロイのあれこれ
今回オリジナルアプリをAWSサーバーを使ってデプロイした時に、備忘録....
自動デプロ化の実装
Capistranoを使いました。
しよするためにまずはGemのインストール
group :development, :test do gem 'capistrano' gem 'capistrano-rbenv' gem 'capistrano-bundler' gem 'capistrano-rails' gem 'capistrano3-unicorn' end
※bundle installを忘れずに!
その後自分のアプリのディレクトリーで
bundle exec cap install
これで必要なファイルの作成ができました。
そのあとは、生成された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の編集
記述内容は、
サーバーホスト名(or IPアドレス)
AWSのサーバーへログインできるユーザー名
サーバーロール(後述)
sshの設定
その他サーバーに紐づく任意の設定
server '用意したElastic IP', user: 'ec2-user', roles: %w{app db web}
次に、deploy.rbの編集
lock 'Capistranoのバージョン' set :application, 'ご自身のアプリケーション名' 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のバージョン' set :ssh_options, auth_methods: ['publickey'], keys: ['~/.ssh/ご自身のキーペア名.pem'] set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" } set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" } set :keep_releases, 5 after 'deploy:publishing', 'deploy:restart' namespace :deploy do task :restart do invoke 'unicorn:restart' end end
※Capistranoのバージョン確認はGemfile.lockで確認可能
ここまで完了したらunicorn.rbの編集
app_path = File.expand_path('../../../', __FILE__) worker_processes 1 working_directory "#{app_path}/current" pid "#{app_path}/shared/tmp/pids/unicorn.pid" listen "#{app_path}/shared/tmp/sockets/unicorn.sock" stderr_path "#{app_path}/shared/log/unicorn.stderr.log" stdout_path "#{app_path}/shared/log/unicorn.stdout.log" (省略)
次にNginvファイルの編集
EC2(ターミナル)で
sudo vim /etc/nginx/conf.d/rails.con
/etc/nginx/conf.d/rails.conf
server unix:/var/www/アプリケーション名/shared/tmp/sockets/unicorn.sock; } server { listen 80; server_name Elastic IP; client_max_body_size 2g; root /var/www/アプリケーション名/current/public; location ^~ /assets/ { gzip_static on; expires max; add_header Cache-Control public; root /var/www/アプリケーション名/current/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; }
nginxを編集したら必ず再起動する。
$ sudo systemctl reload nginx $ sudo systemctl restart nginx
ここまできたらあと少し!!!
$ sudo systemctl status mariadb
でデータベースが起動しているか確認し、オッケーなら
Unicornのプロセスが起動しているので、
ps aux | grep unicorn
でmainってやつの番号を確認、その後
kill プロセス番号
完了したらローカルで全てmasterにプッシュしているか確認して
ローカルのアプリケーションディレクトリーで
bundle exec cap production deploy
これで完了!
あとはローカルで修正したら場合は、その修正箇所によって少し違うが簡単にデプロイが可能になります。
ローカルで修正入れた場合
<状況自動デプロイ前にやること>
・ローカルでVSCodeを修正した場合変更点をリモートリポジトリにcommit→pushする
(本番環境でサーバー再起動をする場合)一度プロセスをkillした上で「bundle exec cap production deploy」
・ローカルでデータベース関連の内容を修正した場合本番環境で「rails db:drop RAILS_ENV=production」「rails db:create RAILS_ENV=production」を実行
(※実行する際、「DISABLE_DATABASE_ENVIRONMENT_CHECK=1」というオプションが必要)
(本番環境でサーバー再起動をする場合)一度プロセスをkillした上で「bundle exec cap production deploy」
・Nginxを修正した場合「sudo systemctl restart nginx」を実行
うまくいかない時の確認場所
・ローカルでは問題なく動いているのか?
・ローカルからGiuHubへのpushのし忘れはないか(mergeできているか)
・GitHubからEC2への反映(git pull origin master)のし忘れは?
・EC2サーバー側でエラーログの内容を確認し、原因を見つけたか?
・Nginxは正しく起動しているか?
・EC2サーバー側の環境変数は正しく設定できているか?
・EC2インスタンスの再起動を行ってみる