Railsアプリ〜デプロイへの道〜その②Ruby・MySQLインストール編【ConoHa VPS・CentOS・Capistrano3・Nginx・Unicorn】

Railsアプリケーションをデプロイした時の手順をまとめた記事の第2弾です。

今回はRubyおよびMySQLのインストール・設定の手順をまとめました。

前回同様こちらの記事がベースとなっています。
https://qiita.com/ryo2132/items/f62690f0b16ec11270fe

〈関連記事〉
[Railsアプリ〜デプロイへの道〜その①リモートサーバーへのSSH接続編](https://qiita.com/fukaya_dea/items/ecb709f35cb93e4a9743)
[Railsアプリ〜デプロイへの道〜その③Capistrano3設定編](https://qiita.com/fukaya_dea/items/b271cf5382ca283baa31)
##開発環境

・Mac OS
・Rails 5.2.3
・Ruby 2.5.1
・ConoHa VPS
・CentOS 7.6
・Capistrano3
・Nginx
・Unicorn


##Rubyのインストール
ConoHa VPSにRubyをインストールしていきます。

##1.Gitインストール
まずGitをインストールします。

```
$ sudo yum -y install git

$ git --version
# version名出力されればOK
```

##2.rbenvインストール
続いてrbenvをインストール。
rbenvはRubyのバージョン管理ツールです。

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

###ruby-burildインストール
こちらもRubyをインストールするために必要になります。

```
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

##3.rbenv設定

rbenvコマンドを使えるようにするためにbash_profileに以下の内容を追加します。

```
# PATHにrbenvコマンドを追加
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
# rbenvの初期化
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# bashの再読込
$ source ~/.bash_profile
# rbenvのバージョン確認　バージョンが出ればOK
$ rbenv -v
```

これでRubyインストールの準備は完了です。
いよいよRubyをインストールします。

##4.Rubyインストール

ローカルで使用中のRubyバージョンを確認
サーバーにインストールする前に、開発で使用したRubyのバージョンを確認します。

ローカル

```
$ ruby -v
```

ローカルと同じバージョンのRubyをインストール

サーバー

```
$ rbenv install 2.5.1 
# globalで使用するrubyの設定
$ rbenv global 2.5.1
# rbenvの再起動？
$ rbenv rehash
# rubyのバージョン確認
$ ruby -v
```

##5.bundleインストール
Gemの管理ツールであるbundlerをインストールします。

bundlerのバージョンを開発したRailsアプリのGemfile.lockのものと合わせる必要があります。
バージョンが合っていないとデプロイ時にエラーが発生します。
参考：https://qiita.com/MotohiroSiobara/items/c0d343a160cffc2902ef

RailsアプリのGemfile.lockを確認

```
BUNDLED WITH 2.0.1
```

サーバー
同じバージョンのbundlerをインストール。

```
$ gem install bundle -v 2.0.1
```

##6.関連パッケージインストール
必要なパッケージを諸々インストール
これらがないとデプロイ時にエラー起こします。

＜参考＞
https://teratail.com/questions/13430
https://qiita.com/jaxx2104/items/2277cec77850f2d83c7a

サーバー

```
#gcc-c++インストール
$ sudo yum install gcc-c++

#node.jsインストール
$ sudo yum install nodejs npm --enablerepo=epel 

#yarnインストール
$ sudo npm install -g yarn
```

##MySQL

##1.事前準備：MariaDBの削除
CentOS７系では標準でMariaDB(MySQL互換のDB)がインストールされている場合があるので、MySQLと競合しないようMariaDBを削除します。

参考：https://qiita.com/miqpim/items/5c519a9979d9b269d47e

サーバー

```
$ rpm -qa | grep maria     # mariaDBが存在するか確認
$ sudo yum remove mariadb-libs  # 本体削除
$ sudo rm -rf /var/lib/mysql  # データ削除
```

rmコマンドのオプションについてはこちらをご覧ください。
参考：https://eng-entrance.com/linux_command_rm

##2.MySQLのリポジトリを登録

Mysql公式のYumリポジトリをインストールします。
最新版は[Mysql公式](https://dev.mysql.com/downloads/repo/yum/)で確認できます。

サーバー

〈参考〉
https://qiita.com/rutko/items/56a33d1ecd70c0480202
https://qiita.com/nooboolean/items/7efc5c35b2e95637d8c1

###CentOSのバージョンの確認

```
$ cat /etc/redhat-release
```

###リポジトリのインストール

yumコマンドのlocalinstallオプションを使うことでリモートにあるrpmファイルをインストールすることができます。
rpmコマンドを使ってのインストールも可能ですが、依存関係とかを考慮したインストールまではしてくれないので、yumでインストールしましょう。
URLはリモートにあるrpmファイルをインストールするためのもので、[公式サイト](https://dev.mysql.com/downloads/repo/yum/)のリポジトリを、 `http://dev.mysql.com/get/`の後に付け加えて完成です。（お使いのOSに合わせたものを選んでください）

詳しくはこちらの記事をご覧ください。
https://qiita.com/nooboolean/items/7efc5c35b2e95637d8c1

```
$ sudo yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
```

###リポジトリの確認
/etc/yum.repos.d配下に、mysql-community-source.repoとmysql-community.repoというリポジトリが作成されてるはずです。

```
$ cd /etc/yum.repos.d/
$ ls
mysql-community-source.repo  mysql-community.repo
```

このリポジトリが作成されて入れば、リポジトリの追加の確認は完了

###インストールできたか確認

```
$ yum repolist all | grep mysql

mysql-connectors-community/x86_64 MySQL Connectors Community      有効:
mysql-connectors-community-source MySQL Connectors Community - So 無効
mysql-tools-community/x86_64      MySQL Tools Community           有効:
mysql-tools-community-source      MySQL Tools Community - Source  無効
mysql55-community/x86_64          MySQL 5.5 Community Server      無効
mysql55-community-source          MySQL 5.5 Community Server - So 無効
mysql56-community/x86_64          MySQL 5.6 Community Server      無効　 <-ここ注目
mysql56-community-source          MySQL 5.6 Community Server - So 無効
mysql57-community/x86_64          MySQL 5.7 Community Server      有効:　<-ここ注目
mysql57-community-source          MySQL 5.7 Community Server - So 無効
```

(環境によっては有効がenabled、無効がdisabledと表示される) 上記の例では、5.7が有効、5.6が無効になっています。 このままインストールすると、有効になっている5.7がインストールされてしまうので、5.6をインストールするには有効無効の切り替えをします。 この切り替えをするためにはyumの設定変更用のyum-utilsパッケージが必要なので、インストールされていない場合はインストールします。

```
$ yum list installed | grep yum-utils  #yum-utilsがインストールされているか確認
$ yum -y install yum-utils #入ってなければyum-utilsをインストールする
$ yum-config-manager --disable mysql57-community     #5.7を無効に設定
$ yum-config-manager --enable mysql56-community       #5.6を有効に設定
```

###設定ができているか再度確認。

```
$ yum repolist all | grep mysql

mysql-connectors-community/x86_64  MySQL Connectors Community       有効:    
mysql-connectors-community-source  MySQL Connectors Community - Sou 無効
mysql-tools-community/x86_64       MySQL Tools Community            有効:     
mysql-tools-community-source       MySQL Tools Community - Source   無効
mysql55-community/x86_64           MySQL 5.5 Community Server       無効
mysql55-community-source           MySQL 5.5 Community Server - Sou 無効
mysql56-community/x86_64           MySQL 5.6 Community Server       有効:    
mysql56-community-source           MySQL 5.6 Community Server - Sou 無効
mysql57-community/x86_64           MySQL 5.7 Community Server       無効
mysql57-community-source           MySQL 5.7 Community Server - Sou 無効
```

5.6が有効になっていればOK。

```
#バージョン確認
$ yum info mysql-community-server
# インストール
$ sudo yum install mysql-community-server mysql-devel
```

mysql-develは必要です。
ないとデプロイ時にエラーが出ます。
参考：https://teratail.com/questions/181707

```
# 確認。バージョン出ればOK
$ mysqld --version
```

###Mysqlの起動/自動起動設定
起動

```
$ sudo systemctl start mysqld.service   #起動
```

自動起動設定

```
$ sudo systemctl enable mysqld.service   #自動起動 ON
$ systemctl disble mysqld   #自動起動 OFF
```

自動起動になっているか確認

```
$ systemctl is-enabled mysqld

mysqld.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig mysqld --level=5
enabled
```

enabledになっていれば自動起動 ONに設定されています。

###基本操作

```
$ sudo systemctl start mysqld.service   #起動
$ systemctl stop mysqld    #停止
$ systemctl status mysqld  #ステータス確認
$ systemctl restart mysqld #再起動
```

ちなみに、mysqldのdはデーモン (daemon)のdらしいです。
デーモンについてはこちらの記事をご覧ください。
https://wa3.i-3-i.info/word11000.html

簡単に言うと「いつでも動けるようにスタンバイしてる常駐プログラム」だそうです。

##3.パスワード、セキュリティ設定

続いてMySQLの設定をしていきます。
今回の山場です。
参考：https://weblabo.oscasierra.net/mysql-57-init-setup/

ログインするために、まず自動生成された初期パスワードを確認します。

```
$ sudo cat /var/log/mysqld.log | grep password
2017-12-31T11:31:07.946947Z 1 [Note] A temporary password is generated for root@localhost: .7ogGO4yokDh
# 「.7ogGO4yokDh」の部分が初期パスワードです
```

確認できたらmysql_secure_installationで初期設定を行います。 以下対話形式で進むので適宜コマンド入力してください。

```
$ mysql_secure_installation


Securing the MySQL server deployment.

Enter password for user root: # ログファイルから取得した初期パスワードを入力します

The existing password for the user account root has expired. Please set a new password.

New password: # root ユーザの新規パスワードを入力します

Re-enter new password: # 確認用にもう一度入力します
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y # 匿名ユーザーアカウントを削除
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y # ローカルホスト以外からアクセス可能な root アカウントを削除
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y # test データベースの削除
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!
```

##4.日本語化

日本語を扱うために文字コードを設定します。
日本語の文字コードはutf8に設定すると思いますが、utf8mb4は絵文字に対応した文字コードなので、僕はutf8ではなくutf8mb4で設定しています。

現状、問題なく使えています。

〈参考〉
https://qiita.com/okamu_/items/5eb81688849fbe351350
https://qiita.com/jkr_2255/items/74fc79e764378b59355a

```
$ sudo vi /etc/my.cnf

#ファイル内の末尾に以下を追記
[mysqld]
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4

#再起動
$ sudo systemctl restart mysqld.service

#文字コード確認
$ mysql -u root -p

$ show variables like "chara%";
```

utf8mb4になってたらOK！

##5.Time-zone設定

〈参考〉
https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html
https://agohack.com/mysql-change-timezone/

###現在のタイムゾーンを確認

```
$ show variables like '%time_zone%';

system_time_zone　：　UTC
time_zone　：　SYSTEM
```

###タイムゾーンデータの確認

```
$ select * from mysql.time_zone;
```

空の場合は、データをインポートする。

###タイムゾーンのインポート

```
$ /usr/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo > ~/timezone.sql
# passwordを聞かれるのでmysqlのパスワードを入力
$ mysql -u root -p -Dmysql < ~/timezone.sql
```

###設定の追加

```
$ sudo vi /etc/my.cnf

# 末尾に以下を追加
[mysqld]
default-time-zone = 'Asia/Tokyo'
```

再起動

```
$ sudo systemctl restart mysqld.service
```

確認

```
mysql > show variables like '%time_zone%';

# 以下表示が出ればOK
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | JST        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
2 rows in set (0.00 sec)
```

MySQLの自動起動設定
サーバーの再起動の際にも、mysqlが自動的に起動するよう設定します。

```
chkconfig mysqld on
```

##まとめ

以上、Railsアプリ〜デプロイへの道〜その②Ruby・MySQLインストール編でした。

次回はいよいよ完結編。
Capistrano3・Nginx・Unicornの設定をし、アプリケーションをデプロイします。

[Railsアプリ〜デプロイへの道〜その③Capistrano3設定編](https://qiita.com/fukaya_dea/items/b271cf5382ca283baa31)