【Rails】本番環境デプロイでよく使うコマンド集！AWS/unicorn/nginx/Capistrano使用

#はじめに
自分用のメモです。
設定や詳細は省き、コマンドのまとめにフォーカスしました。
起こりがちなエラーと併せて記載しております。

##環境
- Rails 5.2.1
- ruby 2.5.1
- capistrano 3.11.1
- AWS(EC2)
- Web Server Nginx
- Application Server Unicorn

##目次
- よく使う（分類なし）
- 環境変数関連
- capistrano関連
- unicorn関連
- nginx関連
- MySql関連


#コマンド集
##よく使う（分類なし）

```irb
# ワーキングプロセス(pid)を確認
$ ps ax -H

# 容量確認
$ df -h

# EC2再起動（再起動後はサーバの起動も忘れずに行う）
$ sudo reboot

# 起動状況の確認、再起動（hogeにはmysqldやnginx）
$ sudo service hoge status
$ sudo service hoge restart

# EC2インスタンス接続時
$ ssh -i hoge.pem ec2-user@123.456.789※ElasticIP

# 自動デプロイを行う(以下ローカル環境、Appディレクトリで)
$ bundle exec cap production deploy
```

##環境変数関連
本番環境でも`~/.bash_profile`で環境変数設定できるが、`Capistrano`使用時は注意。
`Capistrano`は、実行時に`~/.bash_profile`を参照しないようにプログラムされているので`etc/env`を使う。

```irb
# 環境変数書き込み(ローカル)
vim ~/.bash_profile
# 環境変数適用(ローカル)
 source ~/.bash_profile

# 環境変数書き込み（Capistranoを使用する本番環境は特にこちら使用）
$ sudo vim /etc/environment
# 環境変数書き込み反映のため一度切る
$ exit
# 再度EC2インスタンスに接続
$ ssh -i xxxx....
# 環境変数が設定できているか確認
$ env | grep xxxxxx

# credentials.yml.enc(rails5.2)を編集（詳細は別記事にメモ）
$ sudo EDITOR=vim rails credentials:edit
```

##capistrano関連

```irb
# ログ確認
$ less log/capistrano.log
# ログファイルの内容全て表示
$ tail log/capistrano.log 
```

##unicorn関連
基本的にユニコーン起動のエラーはログを見に行くと解決の糸口が見つかる。
S3を設定してCapistranoで自動デプロイを行っても、なぜかS3に画像が保存されないことがあるが、その時は最新の起動時刻に違和感が無いかチェック。
実際に起動させたつもりの時間よりかなり前の記録しかなければ、killして再度自動デプロイかけてみる。

```irb
# 自動デプロイ設定前の起動コマンド
$ unicorn_rails -c config/unicorn.rb -E production -D
# 自動デプロイ設定前、アセットコンパイル後の起動
$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D

# ユニコーン停止
$ kill -QUITcat tmp/pids/unicorn.pid`

# ユニコーンのプロセス確認
$ ps aux | grep unicorn
# プロセス強制終了
$ kill -9 xxxxx

# ログ確認（current下など最新のlogの場所注意）
$ cat log/unicorn.stderr.log
$ cd current/log
$ cat unicorn.staderr.log
# 最新10行ログが見れる
$ tail unicorn.staderr.log 

# ルート権限使って不要なメモリ解放（ページキャッシュ・dentry・inode）
$ sudo su -
$ sync
$ echo 3 > /proc/sys/vm/drop_caches
```

##nginx関連
Nginxを介した処理を行う設定はunicorn.rbにも。

```irb
# rails.confでnginxの設定を修正する
$ sudo vim /etc/nginx/conf.d/rails.conf

# Nginxの設定を変更したら、忘れずに再読込・再起動
$ sudo service nginx reload
$ sudo service nginx restart

# 本番環境のホームディレクトリでlog見れる
$ sudo less /var/log/nginx/error.log 
```

##MySql関連
EC2を一度落とすとMySQLは落ちるので`mysql.sock`がないというエラーに遭遇しやすい。
起動させると直るので要チェック！
また、`mysql.sock`や`log`の記述は`/etc/my.cnf`で確認＆修正！

### my.cnfについて
```irb:my.cnf関連
# 場所を調べる（表示されたファイルは左から順に読み込まれている）
$ mysql --help | grep my.cnf

# ない場合は下記で作られる※中身については本稿では省略
$ sudo vi /etc/my.cnf

# ログ確認のためにファイルを作る場合はmy.cnfの記述とディレクトリを合わせる。
$ sudo touch /var/log/mysqld.log
$ sudo chown ユーザー名:wheel /var/log/mysqld.log
```
### 基本の操作コマンド
```irb:
# 状態を確認する
$ sudo service mysqld status

# 起動コマンド
$ mysql.server start
$ sudo service mysqld start
$ sudo service mysqld restart

# ソケットファイル（mysql.sock）のディレクトリ確認
$ mysql_config --socket

# ルート権限で起動
$ mysql -u root -p 　
Enter password: 設定したパスワード入力
Welcome to the MySQL monitor.  Commands end with ; or \g.
~~~中略~~~~
mysql>
```

### データベースの確認
ちなみに`mysql>`を起動させて本番環境のデータベースを確認する際は、下記の通り。

```irb
# データベース一覧を表示
mysql>show databases;
+-----------------------+
| Database              |
+-----------------------+
| information_schema    |
| hogehoge              |
| mysql                 |
| performance_schema    |
+-----------------------+
4 rows in set (0.00 sec)

# 使用するデータベースを選択
mysql> use hogehoge

# テーブルを表示
mysql> show tables;
+---------------------------------+
| Tables_in_hogehoge              |
+---------------------------------+
| ar_internal_metadata            |
| brands                          |
| categories                      |
| images                          |
| items                           |
| schema_migrations               |
| users                           |
+---------------------------------+
7 rows in set (0.00 sec)

# テーブルの定義の表示
mysql> describe categories;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | NO   |     | NULL    |                |
| ancestry   | varchar(255) | YES  | MUL | NULL    |                |
| created_at | datetime     | NO   |     | NULL    |                |
| updated_at | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

# テーブルの中身の確認
mysql> select * from images;
+----+---------------------+---------+---------------------+---------------------+
| id | image               | item_id | created_at          | updated_at          |
+----+---------------------+---------+---------------------+---------------------+
|  1 | hoge.jpg            |       1 | 2019-09-24 04:27:03 | 2019-09-24 04:27:03 |
|  2 | hoge2.jpg           |       2 | 2019-09-24 04:37:37 | 2019-09-24 04:37:37 |
|  3 | hoge3.jpg           |       2 | 2019-09-24 04:37:37 | 2019-09-24 04:37:37 |
+----+---------------------+---------+---------------------+---------------------+
3 rows in set (0.00 sec)

# データベースの確認終了
mysql> exit
Bye
```
### マイグレーションについて
EC２インスタンス内でのrake db:migrateは環境指定をしてあげる必要あり。
基本的には、自動デプロイで最新のマイグレーションファイルが反映されるが、

- seedを使用していて、ファイルを追記・編集したものを反映させたい
- 大幅な変更があったので本番環境のデータベースの中身を一度消したい

といった場合に使える手順がこちら。

```irb:EC2/appname/current
# まずは環境指定しつつドロップで丸ごと削除
$ RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop

# データベースを作成
$ rake db:create RAILS_ENV=production

# ここで一度自動デプロイをかけて、db:migrateに当たる操作を完了
# 無事作成されたら、再度EC２のcurrentディレクトリでseedを反映させる
$ rake db:seed RAILS_ENV=production

# もちろん必要に応じてリセット（drop・create・migrate）とかも使える
$ rake db:reset RAILS_ENV=production
```


##その他：vimの超基本操作
本番環境でエディタvimを操作する際、超最低限知っておくべき操作。


|   操作  　　　 |        意味          |
|:-----------------|:------------------|
| esc          |          インサートモード/コマンドモード終了（ノーマル）   |
| i            |            インサート（挿入）モード（カーソル位置から）   |
| a            |            インサート（挿入）モード（カーソル後から）   |
| :            |            コマンドモード   |
| :q          |              閉じる |
| :wq          |            保存して閉じる|
| :q!            |             強制的に閉じる |
| :wq!         |           強制的に保存して閉じる |