⑩Rails5.2 + Unicorn 本番環境デプロイ エラー トラブルシューティング

#結 論 >> unicorn 起動エラー解決のポイント
・**エラーログをチェック**
・**環境変数の設定が間違っていないかチェック**
・**database.ymlの記述が間違っていないかチェック**
・**MySQLのrootユーザーパスワードが問題ないかチェック**
・**unicorn.rbの記述が間違っていないかチェック**

#前 提
AWS EC2
rbenv 1.1.2
ruby 2.5.1
Ruby on Rails 5.2
MySQL5.6
Gem unicorn デプロイ

#参考にさせていただいた投稿
[Rails を production モードで起動した際に接続できない（500 エラー）場合の対処法](
https://obel.hatenablog.jp/entry/20170614/1497406949)
[Rails5をproduction（本番環境）で起動する時に嵌ったこと]
(https://qiita.com/qqhann/items/7cd01f4b5cff4a31e053)
[MySQLでよく見かけるエラーの発生原因と対策方法](https://proengineer.internous.co.jp/content/columnfeature/7054)


#作業経緯
```ruby:初めてunicornでデプロイする流れです
1)EC2インスタンス 作成
2)rbenv、ruby、Rails、MySQLインストール
3)MySQLのrootパスワードを設定、 mysql -u root -pコマンドでアクセス可能である
4)Github連携、 $git clone
5)$rails db:create RAILS_ENV=production 
  $rails db:migrate RAILS_ENV=production実行できた
```


##Unicorn起動できない時のエラー文 

```ruby:ターミナルEC2/SSH

#unicorn rails起動コマンド
$bundle exec unicorn_rails -c config/unicorn.rb -E production -D

#エラー文
master failed to start, check stderr log for details
#訳
(マスターを開始できませんでした。詳細についてはstderrログを確認してください)
```


#ログファイルを確認する

unicorn標準エラーログを保存しているファイル”unicorn.stderr.log”を見ます

今回は、unicorn.stderr.logは下記の設定です

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

```ruby:EC2ディレクトリ・unicornエラーログファイルのある場所を確認
#EC2(本番側)アプリのトップディレクトリで ls コマンド実行
$ ls
Gemfile  Gemfile.lock  README.md  Rakefile  app  bin  config  config.ru  db  lib  log  mysql  package.json  public  spec  storage  tmp  vendor

#logディレクトリに移動
$ cd log

#logディレクトリで ls コマンド実行
$ ls
development.log  production.log  unicorn.stderr.log  unicorn.stdout.log

```

#unicorn.stderr.logを確認する
ログファイルを見る方法はいくつかあります


```ruby:ターミナルEC2/SSH
$cat コマンド : ファイルを表示 glepコマンド併用できる

または
$less コマンド : ファイルを閲覧のみ

または
$tail -f コマンド :ログの監視 ファイルの末尾を表示(常に新しいログを追加表示）

```

#cat | grep コマンド


```ruby:ターミナルEC2/SSH
#コマンド１ | コマンド2 : コマンド1の結果をコマンド2へ渡して結果を出力

#unicorn.stderr.logを表示、かつ、”E”の文字列を検索表示する
$ cat log/unicorn.stderr.log | grep "E"


〜省略〜
ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit`
〜省略〜
E, [2020-05-19T05:27:59.396260 #23078] ERROR -- : Access denied for user 'ec2-user'@'localhost' (using password: YES) (Mysql2::Error::ConnectionError)

```
こんな感じです
```cat log/unicorn.stderr.log | grep "E"``` でエラー文を発見できました
とても見やすいです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/6113a405-c963-5e58-cbfd-24777a37a3ac.png)


```ruby:
〜〜補足〜〜
 cat | grep コマンド : catコマンドで表示したものを grepコマンドで検索表示する

コマンド１ |  コマンド2   :   コマンド1の結果をコマンド2へ渡して結果を出力

catコマンド : ファイルの表示

| : パイプ　なおかつ

grepコマンド : ファイル中の文字列に対して正規表現を使って検索表示

コマンド | grep 検索したい文字列

"E" : 文字列 "E" で検索する

```

#less コマンド

```ruby:ターミナルEC2/SSH
#ファイルを閲覧のみ
$less log/unicorn.stderr.log

〜省略〜
ActiveRecord::AdapterNotSpecified: 'production' database is not configured. Available: ["default", "development"]

qキーで戻る

```
こんな感じです
```less log/unicorn.stderr.log```でエラー文を発見できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/5f0865d1-01a3-f464-0352-adf4d9d2be96.png)


#tail -f コマンド


```ruby:ターミナルEC2/SSH
#ログの監視 ファイルの末尾を表示(常に新しいログを追加表示）
$tail -f log/unicorn.stderr.log

〜省略〜

ctr+cで戻る

```

こんな感じです
```tail -f log/unicorn.stderr.log```　エラーがわからない（たまたま？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/06f2acac-a427-7067-cdc6-f187ca782841.png)


#ActiveRecord::AdapterNotSpecified: 'production' database is not configured. Available: ["default", "development"]

「ActiveRecord :: AdapterNotSpecified： 'production'データベースが構成されていません。 利用可能：["デフォルト"、 "開発"]」

Database.ymlの設定、それに関する環境変数でミスってる？

```ruby:ターミナルEC2/SSH
#configディレクトリ移動
$cd config

#database.yml表示
$cat database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['DATABASE_USER'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /tmp/mysql.sock
  host: localhost
development:
  <<: *default
  database: nomadcafe_development
test:
  <<: *default
  database: nomadcafe_test
production:
  <<: *default
  database: nomadcafe_production
  socket: /var/lib/mysql/mysql.sock
```

問題はなさそう..なので

EC2の環境変数を設定している .envファイルを確認してみます

```ruby:ターミナルEC2/SSH

$cd アプリディレクトリトップ

$vim .env
```
環境変数にコメントアウトしたままだったのが原因で、エラーを起こしていました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/9aa0b277-a278-8693-b522-ee38058695bc.png)



#Access denied for user 'root'@'localhost' (using password: YES) (Mysql2::Error::ConnectionError)

「ユーザー 'root' @ 'localhost'のアクセスが拒否されました」

さらに訳すと
username : root、host : localhostがアクセスしようとしましたが権限などのユーザ設定が間違えています

このエラーには、かなり悩まされました

```ruby:作業経緯のおさらいです
1)EC2インスタンス 作成
2)rbenv、ruby、Rails、MySQLインストール
3)MySQLのrootパスワードを設定、 mysql -u root -pコマンドでアクセス可能である
4)Github連携、 $git clone
5)$rails db:create RAILS_ENV=production、 rails db:migrate RAILS_ENV=production実行できた
```

結論を申しますと、
私の場合、database.ymlで環境変数を使いますが、環境変数が正しく呼び出しできていなかったことが原因でした
Usernameやpaswordを一旦、直書きするとエラー解決しました


参考にさせていただいた記事
[MySQLでよく見かけるエラーの発生原因と対策方法](https://proengineer.internous.co.jp/content/columnfeature/7054)


```ruby:抜粋 
２．２　エラー 1045（28000）の原因と対処法
■エラーコード：1045
■SQLSTATE：28000
■エラーメッセージ例： Access denied for user 'ユーザ名'@'ホスト名' (using password: [YES／NO])
■エラーの原因： （YESの場合）権限などのユーザ設定が間違えている。 （NOの場合）ログイン時にパスワードを入力していない、または、入力したパスワードが間違えている。
■エラーへの対処法： （YESの場合）権限の設定が問題ないか確認する。それでもできない場合は、ユーザを一度削除して再度作成してみる。 （NOの場合）ログイン時にオプション「-p」を付け、パスワードを入力する。その上でエラーになる場合、パスワードが間違えていないか確認する。
```

（参考）修正後のdatabase.ymlの記述です
usernameやpasswordは直書きしていましたが、dotenv環境変数を設定しました
これで起動できました!


```ruby:EC2/アプリディレクトリ/config
#database.ymlを表示
$cat database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['DATABASE_USER'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /tmp/mysql.sock
  host: localhost
development:
  <<: *default
  database: nomadcafe_development
test:
  <<: *default
  database: nomadcafe_test
production:
  <<: *default
  database: nomadcafe_production
  socket: /var/lib/mysql/mysql.sock
```


環境変数の参考です
[⑨Rails環境変数 credentials dotenv .bash_profile 【初学者向け】](https://qiita.com/SakagamiKeisuke/items/b6989c8882f16d58aa5f)


#ActionView::Template::Error (The asset "application.css" is not present in the asset pipeline.):


アセット「application.css」はアセットパイプラインに存在しません

本番環境での定番エラーのようです

`config/environments/production.rb`ファイルの中に、`config.assets.compile`という設定項目があります。
デフォルトで`false`となっているところ、`true`に変更します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/d9e0e75a-8a99-aca0-da41-b72a98438a0f.png)


EC2のアプリディレクトリで `rails assets:precompile`を実行してから再起動します

```ruby:ターミナルEC2/SSH

$rails assets:precompile

$bundle exec unicorn_rails -c config/unicorn.rb -E production -D

```

参考にさせていただいた記事
[Rails を production モードで起動した際に接続できない（500 エラー）場合の対処法]
(https://obel.hatenablog.jp/entry/20170614/1497406949)
[Rails5をproduction（本番環境）で起動する時に嵌ったこと]
(https://qiita.com/qqhann/items/7cd01f4b5cff4a31e053)