AWSにNginx+Unicorn環境でRails+Vue.jsアプリを構築した時にやらかしたことと解決法

#背景
自己学習の一環としてAWSにRailsアプリをデプロイしようと思い、ハンズオン形式で勉強した。

- 勉強させて頂いたAWSハンズオン形式の良書
 - https://www.amazon.co.jp/Amazon-Web-Services-基礎からのネットワーク-サーバー構築/dp/4822237443?tag=maftracking197390-22&linkCode=ure&creative=6339

- 勉強させて頂いたAWSハンズオン形式のqiita記事
 - https://qiita.com/naoki_mochizuki/items/5a1757d222806cbe0cd1

書籍ではAWS環境構築とWordpressでしたので、Wordpress部分をqiita記事のRailsに変えれば
構築できるのではと考えました。

その時に色々問題が発生したので解決法のメモとして残しておきます。

#AWSインフラ構成
![AWS構成](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F233011%2F970465ef-9735-bf8c-4efb-634dd4b884b1.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=8ee8fea2040e3bec9e5a3cef15ba8ec8)

同じ構成を発見しましたので下記の記事より引用させて頂きました。
- https://qiita.com/riekure/items/7b266ce291d780f1768b

#t2.microとapache+passengerについて
作業開始当初は書籍でWebサーバはapacheを使用していたのでapacheとRailsを連携させるGemであるpassengerを使用するつもりでした。しかしAWSの無料枠t2.microではメモリが1Gしか使えず、passenger-install-apache2-moduleコマンドでメモリが足りないと怒られてしまいます。

##解決法
お金を使ってt2.microからアップグレードするのも1つですが、今回は使用するWebサーバを変更することで対応した。

色々調査してみると
Rails+Nginx+Unicorn
の構成が多いようなのでこれを選択しました。
#Unicornを起動時validate_secret_key_baseのエラーが出る
Production環境をいじるのが久しぶりすぎて忘れてました。
実際には下記のようなエラーを吐きます

```
`validate_secret_key_base': Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit` (ArgumentError)
```
##解決法
下記の記事を参考にコマンドを実行し、rails newした環境からconfig/master.keyをAWSにSCPコマンドを使用して持ってきました。
これでUnicornは起動できるはず。
- https://qiita.com/scivola/items/cc06ddbfd94d3118f693
#webpackerのエラー
gitからcloneしてきたRails環境でrails webpacker:installコマンドを実行するためにはyarnが必要。
##解決法
ローカルの環境だとyarnが入っていたので気にならなかったが、amazon linux2だとデフォルトでは入っていないため下記の記事を参考にyarnをインストールする。
- https://qiita.com/daikiojm/items/226c453a9a54b4057202

その後は下記の記事を参考にwebpackerを導入する。
- https://qiita.com/NaokiIshimura/items/8203f74f8dfd5f6b87a0

#プリコンパイル忘れ
![AWS構成](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F91664%2F38741f51-78ce-8c86-01a1-271e4b91721a.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=4677ad81110555853ac185aad512507d)
NginxもUnicornも立ち上がって正常に動作しているはずなのに上記のようなエラーが出た場合
プリコンパイルすると見えるようになるかもしれません。
勉強させて頂いた記事にもこの記載がありますが、私もつまづいたので書きます。
##解決法
rake assets:precompile RAILS_ENV=production
コマンドを実行

#IPアドレスでしかアクセスできない(ドメイン名でアクセスできない)
今回一番詰まったところです。AWSの構成時にVPCからDNSホスト名の編集を有効化しパブリックIPとパブリックDNSを設定しました。
勉強させて頂いた記事の中でNginxのコンフィグファイルのserver_nameディレクティブにElasticIPを設定しろと記載があったのでそこにパブリックIPを設定していました。
するとパブリックIPではアクセス可能ですがパブリックDNSで設定されたドメイン名ではアクセスできませんでした。

##解決法
どうやらNginxのHTTPリクエストに対する動作の仕様が原因だったようです。
下記記事で理解できました。
- http://www2.matsue-ct.ac.jp/home/kanayama/text/nginx/node39.html

server_name パブリックDNS パブリックIP;
上記のようにパブリックDNSとIPを同時に設定することで解決しました。
名前解決が上手くいかないのかとかめちゃめちゃ調べまわった挙句しょうもない原因でした。

#server_nameのエラー
```
could not build server_names_hash, you should increase server_names_hash_bucket_size: 64
```
AWSのパブリックDNSを設定すると上記のようなエラーが出てくることもあると思います。
これは名前が長いって怒られています。
##解決法
エラーメッセージにも書かれているように
server_names_hash_bucket_size: 64
の記載をNginxの設定ファイルに記載します。
下記の記事を参考にしてください。
- https://qiita.com/madaran0805/items/8a32b123fa94018284fa

#まとめ
上記のつまづき以外にもfaviconで404エラーとかdatabase.ymlの修正とかありましたが、その辺は割愛させてください。Nginxのerrorログを調べていけば解決できると思います。

今回はNginx初心者の私の無知さが出た記事となりました。
ハンズオンや教材をやったけど上手くいかなかった方が検索してこの記事が力になれれば幸いです。