AWSを用いてrailsアプリをデプロイするプロセスを頑張って噛み砕いてみるvol.5

## 近況報告
　**私の大好きなアーティスト，ポルノグラフィティのボーカル，岡野昭仁がyoutuberデビュー**して一ヶ月。最新の投稿ではLiSAのカバーしてて界隈では大盛り上がりでした。~~界隈 #とは~~

何がすごいって，カバーなのに岡野昭仁の曲と化すんですよ。圧倒的な経験実力声量があるからこそですよね。プログラミングも先人たちの知恵をコピーしたり応用したりフル活動して自分たちの作品を作り上げていくのだから負けては要られません！

### 今回の目標
・インフラ整備での各アクションの言語化
・コードを単に打っているだけでは理解しきれないし，他に応用できないので言語化して整理
・テックキャンプ受講生支援

##　おおまかな流れ
・本番環境でrailsを起動させる。
・アセットファイルのコンパイル

##事前準備
[vol.1](https://qiita.com/aaabb6211/items/6194fa53f29061dc5444)
[vol.2](https://qiita.com/aaabb6211/items/2f8c5034b791767dee7a)
[vol.3](https://qiita.com/aaabb6211/items/ed338de73ec123851308)
[vol.4](https://qiita.com/aaabb6211/items/9a3577aa038546387887)

### 本番環境でrailsを起動させる。
vol.4まででrailsの準備はできました。この時点でローカル環境でいう「rails db:create」はまだ行なっていませんが，カリキュラムに沿って見ていくので少々お待ちを。

```EC2.
$ cd /var/www/[自分のリポジトリ]
$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D

master failed to start, check stderr log for details
```
・bundle execはgemfile.lockにあるものをrequireするためのコマンド⇨[参考](https://qiita.com/diskkid/items/0d000a42df04c561ca0f)
・-c config/unicorn.rb は設定ファイルの指定
・-E production は環境を「本番モードとして動作させる」
・-Dは「Daemon(デーモン)」の略で、プログラムを起動させつつターミナルで別のコマンドを打てるようにするオプション。つまり，ターミナルは打てる状態だけどしっかり**裏で動いているよー**って感じ。

そしてこんな感じでエラーが発生します。logを見ろだって。エラーを確認しましょう。

```
$ less log/unicorn.stderr.log

I, [2016-12-21T04:01:19.135154 #18813]  INFO -- : Refreshing Gem list
I, [2016-12-21T04:01:20.732521 #18813]  INFO -- : listening on addr=0.0.0.0:3000 fd=10
E, [2016-12-21T04:01:20.734067 #18813] ERROR -- : Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/mysql2_adapter.rb:29:in `rescue in mysql2_connection'
〜省略〜
```
lessはLinuxにおいてファイルの閲覧に用いられます。開発環境のエラーログはrailsのlogファイルを見ればいいのですが，本番環境はvsコードみたいに見れない（多分）ので，logファイル中のunicornを指定してstderr（エラーの出力をした）.logを確認します。

ここで重要なのは

```
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```
MySQLが繋がってないよー

そりゃあDB作成してないしね笑

やることは２つ
・**DB：create**

```
$ rails db:create RAILS_ENV=production
Created database '<データベース名>'
$ rails db:migrate RAILS_ENV=production
```
もしMySQLが止まっていたら，sudo service mysqld startを実行。

・**railsの本番環境でのデータの保存先を指定**

```config/database.yml（ローカル
production:
  <<: *default
  database: ~~~（それぞれのアプリケーション名によって異なっています。こちらは編集しないでください）
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```
必要な部分を編集。socketはEC2のルートディレクトリを調べるとそこに存在しています。
補足　[本番環境のディレクトリについて](http://www.7key.jp/computer/linux/directory.html)

記述が終わったらpushして，EC2上に持って来ましょう

```EC2.
git pull origin master
```
ではもう一度ユニコーンを実行してみる

```EC2.
$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```
エラー表示が出なければ成功（デーモンなのでターミナルに実行状態が表示されない）

###アセットファイルのコンパイル
assetfile conpileって書くとわかりやすいかな？~~conpileわからない？知らん！~~
現状CSSとかJS，画像のファイルが毎度読み込まれない状態なのでそれをどうにかしていきます。

```EC2.(自分のディレクトリ
rails assets:precompile RAILS_ENV=production
```
著者はこんなエラーに遭遇

```
Sass::SyntaxError: File to import not found or unreadable: textbox/textConcept.
```
今までデプロイ作業して来た中でも初見さんでした。

これはsassファイルのimportに失敗したということは，textbox以下のファイルは関係なし，asset/apprication.scssに問題があると判断。結果，アルファベットの大文字小文字のミスでしたー泣

修正して再度実行。エラーなく成功！

アセットファイルを反映させるためにUnicornを再起動します。

```EC2.
$ ps aux | grep unicorn
ec2-user 14500  0.0 16.2 ４36632 100000 ?       Sl   11:25   0:01 unicorn_rails master -c config/unicorn.rb -E production -D                                                                                            
ec2-user 14505  0.0  4.3 ４53６632 99999 ?        Sl   11:25   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D                                                                                         
ec2-user 15452  0.0  0.2 555555  5555 pts/2    S+   13:03   0:00 grep --color=auto unicorn
```
Unicornを止めるにはMasterの停止が必要なので，killコマンドを用いて停止します

```EC2.
$ kill 14500(Unicornのマスターの一番左にある数列を入力してください。⬆︎のでは14500)
$ ps aux | grep unicorn　⇨本当に止まったか確認
ec2-user 15452  0.0  0.2 555555  5555 pts/2    S+   13:03   0:00 grep --color=auto unicorn
$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D 
⇨Unicorn再起動
```
最後のコマンドRAILS_SERVE_STATIC_FILES=1 はコンパイルされたアセットファイルを見つけるための記述だそう。。でも気になります。RAILS_SERVE_STATIC_FILESって何でしょう。大文字での記述に身に覚えがある記述してませんか？そうです。**環境変数としてアセットファイルは呼び出されている**のです。１に関しては設定できていれば何でもいいのだそう。

補足

```EC2
$tail -f log/production.log
```
を用いると、アプリケーションにアクセスがあった場合にリアルタイムにログが流れることが確認できます

##おわりに
rails起動できたー！！！（デプロイ３回目）
あとはNginxの搭載ですね〜

微量でも参考になったらLGTM，ご指導はコメント欄にお願いします！