個人アプリ開発 AWSデプロイでハマった
前回の記事で一通りデプロイ作業を行いましたが、結果本番環境で表示を確認することができませんでした。
今日はエラーログを辿り、一つ一つ解決していきました。
躓き
1.Railsが起動できない。
EC2のアプリのディレクトリで下記コマンドを実行するとエラーが出ました
bundle exec unicorn_rails -c config/unicorn.rb -E production -D
・手順を見返し、漏れがないか確認
→問題無し
・ローカルのmasterのpush、EC2側でpullがちゃんとできているか確認
→問題無し
・EC2インスタンスの再起動
→問題無し
・デバッグし確認
EC2サーバ側で、/var/www/<リポジトリ名>/log/unicorn.stderr.logをlessコマンドで確認
→エラーが出ていたが、内容が分からない
”bundler: failed to load command: unicorn_rails (/home/ec2-user/.rbenv/versions/2.5.1/bin/unicorn_rails)
ArgumentError: Unknown key: :throgh. Valid keys ….”
・ひたすらググる
→stack overflowで同じエラーをリレーションの改善で解決した例を発見。
自分のコードを見返してみる
▶︎不要なモデルがあり、また、そのリレーションをしっかり記述できていなかったことが原因だった。
モデルを削除し、関連するリレーションの記述も削除することで、Railsの起動ができた。
2.本番環境のURLを叩くとページが表示されない
下記エラーが出て表示がされませんでした。
We're sorry, but something went wrong.
・エラーログを確認
$ cd /var/www/app-name $ cd log $ cat production.log
するといくつかのエラーが確認できた
ActionView::Template::Error
調べたところ、開発環境と本番環境でimagesディレクトリへのパスが異なるために起きたエラーだった。
アセットコンパイル前(開発環境) app/assets/images アセットコンパイル後(本番環境) public/assets/images
・下記のようにパスの指定方法を変更
image_tag asset_path('ファイル名')
上記を試したが、ログのエラーが消えず、サイトを見れない
▶︎unicornを再起動できていなかった。
これでやっとサイトを見れるようになりました。
3.一部の表示がおかしい
TOPページの一部、faviconの表示がされない。
・ログを確認すると、下記エラーが。
Uglifier::Error: Unexpected token: name (w). To use ES6 syntax, harmony mode must be enabled with Uglifier.new(:harmony => true).
「ES6を使うにはUglifier.new(:harmony => true)でharmony modeを有効にしてね」とのこと
→調べたところ、UglifierはJavaScriptの圧縮をしてくれるgem。ただES5までしか対応していなかった。
▶︎本番環境の設定ファイルを編集
[config/environments/production.rb] # config.assets.js_compressor = :uglifier →コメントアウト
▶︎再度アセットファイルをコンパイル、Unicorn、Railsの再起動
問題なく表示がされるようになった。
エラーでアセットファイルのコンパイルが正しく完了していなかったことが原因だったようです。
感想
デプロイはまだ不慣れだったことや、工程が長かったこと、あともし解決できなかったら、これまでの努力が水の泡になってしまうのではないかという不安で、めちゃくちゃ焦りました。
ただ試行錯誤したことで、サーバサイドの理解が深まったと思います。
ひとまずデプロイができて安心しました。
まだまだ一喜一憂ありますが、日々精進していきます。
コマンドまとめ
# EC2ログイン cd .ssh/ ssh -i aqua-log.pem ec2-user@54.249.237.209 cd /var/www/ cd /var/www/aquq-log/ # ログ確認 cd log cat production.log cat log/production.log # Git pull git pull origin master # Mysql再起動 $ sudo service mysqld stop $ sudo service mysqld start # Nginx再起動 $ sudo service nginx restart # Unicorn再起動 # プロセスを確認 [ec2-user@XXX <リポジトリ名>]$ ps aux | grep unicorn # 「unicorn_rails master」と表示されているプロセスがUnicornのプロセス本体 # killコマンドを入力してUnicornのプロセスを停止 [ec2-user@XXX <リポジトリ名>]$ kill <確認したunicorn rails masterのPID> [ec2-user@XXX <リポジトリ名>]$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D