4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

EC2インスタンスにRails + MySQL環境構築

Last updated at Posted at 2021-02-26

はじめに

AWSEC2インスタンス立ち上げたところからのサーバー構築手順です。

・設定用のツールをインストール
・Node.jsをインストール
・Yarnをインストール
・rbenvとruby-buildをインストール
・Rubyをインストール
・MariaDBをインストール(サーバーにDB設定する場合)
・Githubとの接続
・Unicornをインストール
・Githubからコードをクローン
・gemをインストール
・環境変数の設定
・アセットファイルをコンパイル
・本番環境でRailsを起動

ここまではアプリケーションサーバー構築。
WEBサーバー構築は以下。
EC2サーバーにRails + Nginx

設定用のツールをインストール

yumというコマンドを使ってこのサーバに元々あるプログラムをアップデートします。

$ sudo yum -y update

環境構築に必要なパッケージを諸々インストール。(長いコマンド)

$ sudo yum  -y install git make gcc-c++ patch libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel libxml2-devel libxslt-devel ImageMagick ImageMagick-devel openssl-devel libcurl libcurl-devel curl

Node.jsをインストール

サーバーサイドで動くJavaScriptのパッケージです。

$ sudo curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
$ sudo yum -y install nodejs

Yarnをインストール

Railsに搭載されているJavaScriptのパッケージを管理するためのパッケージマネージャです。

$ sudo yum -y install wget
$ sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
$ sudo yum -y install yarn

rbenvとruby-buildをインストール

rbenvruby-buildは、Rubyのバージョンを管理する際に組み合わせて使うツールになります。これらはRubyをインストールする前に、インストールする必要があります。
ruby-buildrbenvのプラグインであり、ruby-buildによってRubyの様々なバージョン(2.0.0など)をインストールすることができます。
rbenvを使用することでrubyのバージョンを切り替えることできます。

#rbenvのインストール
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

#パスを通す(どのディレクトリからもアプリケーションを呼び出せる状態にする)
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

#rbenvを呼び出すための記述
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

#.bash_profileの読み込み
$ source .bash_profile

#ruby-buildのインストール
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

#rehashを行う
$ rbenv rehash

Rubyをインストール

Rubyのインストールには時間がかかります。

$ rbenv install 2.6.5
$ rbenv global 2.6.5 #EC2インスタンス内で使用するRubyのバージョンを決める
$ rbenv rehash  #rehashを行う
$ ruby -v # バージョンを確認

AWS RDSを使用する場合はMariaDB関連操作は不要。

MariaDBをインストール(サーバーにDB設定する場合)

Amazon Linux 2を利用している場合、MariaDByum コマンドからインストールすることができます。

$ sudo yum -y install mysql56-server mysql56-devel mysql56 mariadb-server mysql-devel

○○○利用できませんと表示されますが問題ありません。

データベースを起動

データベースを起動するためにsystemctlコマンドを利用します。これは、Amazon LinuxCentOSに含まれているもので、インストールしたソフトウェアの起動を一括して行えるツールです。

$ sudo systemctl start mariadb
$ sudo systemctl status mariadb #起動できたか確認

データベースのrootパスワードの設定

yum でインストールしたMariaDBには、デフォルトで root というユーザーでアクセス出来るようになっていますが、パスワードは設定されていません。パスワードを設定していきます。

$ sudo /usr/bin/mysql_secure_installation

対話形式でパスワードを設定します。

データベースへの接続確認

$ mysql -u root -p

パスワードを入力するように表示されるので、先程設定したパスワードを入力して、Enterしてください。

Githubとの接続

EC2サーバのSSH鍵ペアを作成

$ ssh-keygen -t rsa -b 4096

Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
The key fingerprint is:
3a:8c:1d:d1:a9:22:c7:6e:6b:43:22:31:0f:ca:63:fa ec2-user@ip-172-31-23-189
The key's randomart image is:
+--[ RSA 4096]----+
|    +            |
| . . =           |
|  = . o .        |
| * o . o         |
|= *     S        |
|.* +     .       |
|  * +            |
| .E+ .           |
| .o              |
+-----------------+

全て何も入力せずにEnterキーで進んでください。

生成されたSSH公開鍵を表示し、値をコピーします。

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2E......

catで表示させた公開鍵を、Githubにアクセスして登録していきます。
https://github.com/settings/keys

①Titleは自由に記入
②Keyに公開鍵をペースト
Add SSH Keyを押して保存

Githubに鍵を登録できたら、SSH接続できるか以下のコマンドで確認

$ ssh -T git@github.com
Hi <Githubユーザー名>! You've successfully authenticated, but GitHub does not provide shell access.

Permission denied (publickey). と表示された場合は、SSH鍵の設定が間違っているので、作業を確認してください。

アプリケーションサーバの設定

アプリケーションサーバとは、ブラウザからの「リクエスト」を受け付けRailsアプリケーションを実際に動作させるソフトウェアのことです。

Unicornをインストール

ローカル環境のGemfile を編集

group :production do
  gem 'unicorn', '5.4.1'
end

ローカルのターミナルで

% bundle install

config/unicorn.rbを作成し、内容を以下のように編集


#サーバ上でのアプリケーションコードが設置されているディレクトリを変数に入れておく
app_path = File.expand_path('../../', __FILE__)

#アプリケーションサーバの性能を決定する
worker_processes 1

#アプリケーションの設置されているディレクトリを指定
working_directory app_path

#Unicornの起動に必要なファイルの設置場所を指定
pid "#{app_path}/tmp/pids/unicorn.pid"

#ポート番号を指定
listen 3000

#エラーのログを記録するファイルを指定
stderr_path "#{app_path}/log/unicorn.stderr.log"

#通常のログを記録するファイルを指定
stdout_path "#{app_path}/log/unicorn.stdout.log"

#Railsアプリケーションの応答を待つ上限時間を設定
timeout 60

#以下は応用的な設定なので説明は割愛

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

Githubからコードをクローン

EC2サーバーにSSH接続後に以下の操作

#mkdirコマンドで新たにディレクトリを作成
$ sudo mkdir /var/www/

#作成したwwwディレクトリの権限をec2-userに変更
$ sudo chown ec2-user /var/www/

#移動
$ cd /var/www/

#Githubから「リポジトリURL」を取得しクローンします
$ git clone https://github.com/<ユーザー名>/<リポジトリ名>.git

Swap(スワップ)領域作成

Swap領域は、メモリが使い切られそうになった時にメモリの容量を一時的に増やすために準備されるファイルです。

EC2はデフォルトではSwap領域を用意していないため、これを準備することでメモリ不足の処理エラーを防ぎます。

$ 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'

gemをインストール

rbenvでインストールされたRubyが使われているかチェック

$ cd  /var/www/<アプリ名>
$ ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]

本番環境でgemを管理するためのbundlerをインストールして、bundle installを実行

ローカル環境でバージョン確認。

#ローカル環境 アプリのディレクトリで以下を実行
% bundler -v
Bundler version 2.1.4

ローカルと同じバージョンをEC2サーバー上で以下のコマンド

# ローカルで確認したbundlerのバージョンを導入する
$ gem install bundler -v 2.1.4

$ bundle install

#環境変数の設定
環境変数は、Railsからは ENV['<環境変数名>'] という記述でその値を利用することができます。今回は、 SECRET_KEY_BASE という環境変数を指定していきます。

$ rake secret
69619d9a75b78f2e1c87ec5e07541b42f23efeb6a54e97da3723de06fe74af29d5718adff77d2b04b2805d3a1e143fa61baacfbf4ca2c6fcc608cff8d5a28e8d

この長い英数の羅列は、この後利用するのでコピーしておきます。

環境変数は /etc/environment というファイルに保存することで、サーバ全体に適用されます。

$ sudo vim /etc/environment

#前章で設定したデータベースのrootユーザーのパスワードを入力
DATABASE_PASSWORD='データベースのrootユーザーのパスワード'
SECRET_KEY_BASE='先程コピーしたsecret_key_base'

書き込みができたら esc(エスケープキー)を押下後、:wqと入力して内容を保存します。
保存できたら環境変数を適用するために一旦ログアウト。

$ exit
logout
Connection to 52.xx.xx.xx closed.

再度ログイン。

$ ssh -i [ダウンロードした鍵の名前].pem ec2-user@[作成したEC2インスタンスと紐付けたElastic IP]

環境変数が適用されているか確認

$ env | grep SECRET_KEY_BASE
SECRET_KEY_BASE='secret_key_base'

$ env | grep DATABASE_PASSWORD
DATABASE_PASSWORD='データベースのrootユーザーのパスワード'

ポートを開放

config/unicorn.rblisten 3000 と記述しましたが、これはRailsのサーバを3000番ポートで起動するということを意味します。

EC2インスタンスのセキュリティグループを編集しカスタムTCPでポート3000を許可してください。

database.ymlの本番環境の設定

config/database.yml(ローカル)を以下のように設定。


  <<: *default
  database: ~~~(それぞれのアプリによって異なる)
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

RDSなど使用の場合はまた異なります。

ローカルでの編集をコミットして、GitHubにプッシュし、EC2へ再度クローンします。

$ git pull origin master

データベースを作成しマイグレーションを実行

EC2サーバー上で以下のコマンド。

$ rails db:create RAILS_ENV=production
Created database '<データベース名>'

$ rails db:migrate RAILS_ENV=production

もしデータベースが起動していないときは

sudo systemctl start mariadb

アセットファイルをコンパイル

本番モードでは、事前にアセットをコンパイルする必要があります。

$ rails assets:precompile RAILS_ENV=production

本番環境でRailsを起動

unicorn のgemをインストールしていると unicorn_rails というコマンドが使えるようになっています.
ローカルでいうrails sにあたります。

Unicornのプロセスを確認

$ ps aux | grep unicorn
ec2-user 17877  0.4 18.1 588472 182840 ?       Sl   01:55   0:02 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user 17881  0.0 17.3 589088 175164 ?       Sl   01:55   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
ec2-user 17911  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn

「unicorn_rails master」と表示されているプロセスがあればkillコマンドで停止してください。

$ kill <確認したunicorn rails masterのPID>

unicornを起動

$ cd /var/www/[リポジトリ]
$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D

RAILS_SERVE_STATIC_FILES=1は、コンパイルされたアセットをRailsが見つけられるような指定です。

ブラウザで確認

http://<Elastic IP>:3000/で正常に表示されれば成功です。

うまく表示されない場合

エラーが起こっているのでログを確認。

$tail -f /var/www/<アプリ名>/log/production.log

または/var/www/<リポジトリ名>/log/unicorn.stderr.logをlessまたはcatコマンドで確認。

設定は以上です。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?