7839

雑草魂エンジニアブログ

【EC2】Rails5 環境構築(Ruby + MySQL5.7 + Node.js + Nginx)

最近、全く更新できていなかった。。。
今年やったことは今年のうちに。自分の棚卸しも兼ねて、一気にアウトプットしていきたいと思う。

今回は、AWSのEC2に、Railsアプリケーションをデプロイするにあたり、毎回調べていたので、備忘録として環境構築方法を残しておく。

環境構築

  • EC2 (t2.micro)
  • Amazon Linux release 2 (Karoo)
  • Ruby Ver 2.6.3
  • MySQL Ver 5.7.32
  • Node.js Ver 14.15.2
  • Nginx Ver 1.18.0

EC2が起動した後に、SSH接続する

まず全ての更新処理を実行する

$ sudo yum update

git インストール

$ sudo yum install git
$ git --version
git version 2.23.3

rbenv インストール

デフォルトでは、/usr/local/rbenv にセットアップされるが、どのユーザーも使えるように、/opt/rbenv にセットアップする。

1. ディレクトリを作成して、そのパスを環境変数 RBENV_ROOT に設定する。

$ sudo mkdir /opt/rbenv
$ export RBENV_ROOT=/opt/rbenv

2. git を用いて、rbenv を /opt/rbenv に clone する。

$ sudo git clone https://github.com/sstephenson/rbenv.git /opt/rbenv
$ sudo mkdir /opt/rbenv/versions
$ sudo mkdir /opt/rbenv/shims

3. すべてのユーザが rbenv を利用できるように、PATHを追加する。(/etc/profile.d に設定ファイルを作成する。)

$ sudo vi /etc/profile.d/rbenv.sh
export RBENV_ROOT="/opt/rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

4. リロードさせて、バージョンが確認できれば、インストール完了である。

$ source /etc/profile
$ rbenv -v
rbenv 1.1.2-40-g62d7798

5. さらに、Ruby を rbenv 経由でインストールする時に必要なプラグイン ruby-build も clone する。

$ sudo git clone https://github.com/sstephenson/ruby-build.git /opt/rbenv/plugins/ruby-build

6. インストールを実行する。(PREFIX でインストール先を指定しておく。)

$ PREFIX=/opt/rbenv sudo /opt/rbenv/plugins/ruby-build/install.sh

7. インストール可能な Ruby のバージョン一覧が表示されれば、ruby-buildのインストールは完了である。

$ rbenv install -l
2.5.8
2.6.6
2.7.2
Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all / -L' to show all local versions.

Ruby インストール

Rubyをインストールする際に、必要なパッケージを事前にインストールしておく。(必要なパッケージに関しては、ruby-build_suggested-build-environment参照。ただし、gcc-6 は利用できないため、gcc-c++に変更。)

$ sudo yum install -y gcc-c++ bzip2 openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel

1. 今回インストールしたいのは、ver2.6.3 なので、バージョンを指定してインストールする。(root ユーザーでインストールを行った。root権限がないと、2.6.3のフォルダを作成する際にエラーが発生する。)

$ sudo -s
[root@]$ rbenv install 2.6.3

2. rbenv で使用する Ruby のバージョンを指定する

[root@]$ rbenv global 2.6.3
[root@]$ rbenv rehash

3. Ruby のバージョンを確認する

[root@]$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]

4. Gem は個別に bundler で管理するので、システムにインストールする Gem は bundler だけなので、bundler のみをインストールしておく。

[root@]$ gem install bundler
Fetching bundler-2.2.1.gem
Successfully installed bundler-2.2.1
Parsing documentation for bundler-2.2.1
Installing ri documentation for bundler-2.2.1
Done installing documentation for bundler after 3 seconds
1 gem installed

5. rootユーザーから、一般ユーザに戻る。

[root@]$ exit

MySQL5.7 インストール

1. 既存のパッケージがインストールされているか、事前に確認する

$ yum list installed | grep mariadb
$ yum list installed | grep mysql

2. 初期からインストールされている MariaDB 用パッケージを削除する。

$ sudo yum remove mariadb-libs

3. MySQLリポジトリyumに追加する。

$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

4. 今回は、MySQL5.7を使いたいので、MySQL8.0の無効化をして、MySQL5.7を有効化する。最後に、インストール可能なパッケージを確認する。

$ sudo yum-config-manager --disable mysql80-community
$ sudo yum-config-manager --enable mysql57-community
$ yum info mysql-community-server mysql-community-devel

5. MySQL5.7が利用可能であることが確認できたので、インストールする。

$ sudo yum install mysql-community-server mysql-community-devel

6. MySQLのバージョンが確認できたら、インストールは完了。(追加で、ログファイルを作成しておく。)

$ mysqld --version
mysqld  Ver 5.7.32 for Linux on x86_64 (MySQL Community Server (GPL))
$ sudo touch /var/log/mysqld.log

7. mysqld を起動する。

$ sudo service mysqld start

8. 起動状況の確認をする。

$ systemctl status mysqld.service

9. インスタンスの起動と同時に起動するように設定する。

$ sudo chkconfig mysqld on

10. 初期パスワードを確認する。

$ sudo less /var/log/mysqld.log | grep root@localhost
2020-12-17T03:16:27.232843Z 1 [Note] A temporary password is generated for root@localhost: (2<hB;Mwa(+X

末尾の部分がrootユーザの初期パスワードとなる。

11. mysqlにrootユーザでログインする。(パスワードを求められるので、上記のパスワードでログインする。)

$ mysql -u root -p
Enter password: 

12. パスワードの再設定を行う。(ただし、パスワードには、大文字、小文字、特殊文字(アスタリスク等)を含む必要がある。)

mysql> ALTER USER 'root'@'localhost' identified BY '<-新パスワード->';
mysql> exit

これでMySQLの設定は完了である。

Node.js(nvm) インストール

Node.jsの開発環境を構築するにあたって、バージョン管理できるライブラリとして nvm を使うこととする。 基本的には、rbenv と同じような流れでインストールを行う。

1. ディレクトリを作成して、そのパスを環境変数 NVM_ROOT に設定する。

$ sudo mkdir /opt/nvm
$ export NVM_ROOT=/opt/nvm

2. git を用いて、nvm を /opt/nvm に clone する。

$ sudo git clone https://github.com/nvm-sh/nvm.git /opt/nvm
$ sudo mkdir /opt/nvm/versions

3. すべてのユーザが nvm を利用できるように、PATHを追加する。(/etc/profile.d に設定ファイルを作成する。)

$ sudo vi /etc/profile.d/nvm.sh
export NVM_ROOT="/opt/nvm"
export PATH="$NVM_ROOT/bin:$PATH"
[ -s "$NVM_ROOT/nvm.sh" ] && \. "$NVM_ROOT/nvm.sh"  # This loads nvm
[ -s "$NVM_ROOT/bash_completion" ] && \. "$NVM_ROOT/bash_completion"  # This loads nvm bash_completion

4. リロードさせて、バージョンが確認できれば、インストール完了である。

$ source /etc/profile
$ nvm -v
0.37.2

5. rootユーザーになり、インストール可能な Node.js のバージョン一覧を表示する。

$ sudo -s
[root@]$ nvm ls-remote

6. Node.js のインストールする。(/opt/nvm/versions/node/[version No.] にインストールされる)

[root@]$ nvm install 14.15.2

7. 使用するバージョンを指定する。

[root@]$ nvm use v14.15.2

8. Node.js のバージョンが確認できれば、完了である。

[root@]$ node -v
v14.15.2
[root@]$  npm -v
6.14.9

9. また、yarn を使いたいので、yarn をインストールしておく。(yum でのインストールも可能であるが、nvm の node のバージョンと紐付けて管理したいので、npm でのインストールを行う。)

[root@]$ npm install -g yarn

10. yarn のバージョンを確認する。

[root@]$ which yarn
/opt/nvm/versions/node/v14.15.2/bin/yarn
[root@]$ yarn -v
1.22.10

11. rootユーザーから、一般ユーザに戻る。

[root@]$ exit

Nginx インストール

今回は、amazon-linux-extras リポジトリからインストールする。

1. インストール可能なパッケージ一覧を確認する。

$ amazon-linux-extras

 37  mono                     available    [ =5.x  =stable ]
 38  nginx1                   available    [ =stable ]
 39  ruby2.6                  available    [ =2.6  =stable ]

2. Nginx が存在するので、インストールする。

$ sudo amazon-linux-extras install nginx1

3. 設定ファイルのバックアップをしておく。

$ sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.back

4. Nginx を起動し、自動起動有効化を設定し、最後にステータスを確認する。

$ sudo systemctl start nginx
$ sudo systemctl enable nginx
$ systemctl status nginx

5. EC2 のIPアドレスにアクセスして、Nginx の画面が表示されれば動作確認も完了となる。

その他、よく使うコマンドは以下の通りである。

# 設定を再読み込み
$ sudo systemctl reload nginx
# Nginx 停止
$ sudo systemctl stop nginx

Railsのサンプルアプリ作成

動作確認のために、Rails のサンプルアプリケーションを作成する。

1. ディレクトリを作成し、bundle init して、Gemfileを編集する。

$ mkdir sample
$ cd sample
$ bundle init
$ vim Gemfile

2. 今回、Rails v5.2.3 をインストールするように Gemfile を変更する。

# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem "rails", "~> 5.2.3"

3. 必要なGemをインストールする。ただし、システムには入れず、現在のパス配下の「vendor/bundle」にインストールさせる。(--jobs=4と指定することで、並列処理が可能となり、高速化される。)

$ bundle install --path vendor/bundle --jobs=4

4. 現在のディレクトリに、Rails ファイルを生成する。(Gemfileを上書きしていいか確認されるので、Yで続行する。)

$ bundle exec rails new . -d mysql -BJT

オプションでの指定は以下の通りである。(詳細に関しては、 bundle exec rails new -h で確認できる。)

  • -d mysql:データベースを MySQL に指定する。
  • -B:(--skip-bundle)Rails 作成時に bundle install を行わない。
  • -J:(--skip-javascript, --skip-turbolinks)JavaScript ファイルを作成しない。
  • -T:(--skip-test)railsのデフォルトのテストminitestを使わない。

5. 追加したい Gem を Gemfile に追加して、インストールを行う。(上記で Gemfile を上書きしているため、conflict が発生するので、bundle install ではなく、bundle updateを実行する。)

$ bundle update

6. MySQLサーバーに接続するために、config/database.yml のpasswordが空欄となっているので、先ほど設定した MySQL のrootユーザーの password を追記する。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: <-- パスワードを追記する -->
  host: localhost

7. Rails 用のデータベースを作成する。

$ bundle exec rake db:create

8. 次に、Nginx で表示できるように、今回のsampleアプリ用の Nginx の設定ファイルを追加する。

$ sudo vim /etc/nginx/conf.d/sample.conf

server {
  # リクエストを受けるポートを設定する
  listen   80;
  server_name localhost;
  location / {
    # 80 ポートで受けたリクエストを 3000 ポートに中継する
    proxy_pass http://127.0.0.1:3000;
  }
}

9. Nginx を再起動する。

$ sudo systemctl reload nginx

10. 最後に、Rails サーバーを起動する。

$ bundle exec rails s

11. EC2 のIPアドレスにアクセスして、無事に Rails の起動画面が表示されれば、完了である。

https://railsguides.jp/railsguides/images/getting_started/rails_welcome.png

長々とお疲れ様でした。

まとめ

無事に Rails アプリケーションの環境を構築することができた。環境構築方法は様々あるので、これからも最適解を探していきたい。

それでは、ステキな開発ライフを。