はじめに
自動デプロイは直前まで問題なく作動していたにも関わらず、view周りのファイル修正後、発生しました。
そのため、特定まで少々時間を要したので、エラー解決まで辿ったデバッグの履歴と共に備忘録として記載します。
開発環境
- Rails 5.2.3
- ruby 2.5.1
- capistrano 3.11.1
- AWS(EC2)
- Web Server Nginx
- Application Server Unicorn
先に結論
根本原因は不明なものの、aws-sdk
というgemを追加することで解決。
エラー文(ファイルのLoadError)
# 本番環境でlog表示(less or cat)
$ less log/unicorn.stderr.log
# エラー抜粋
I, [2019-09-20T08:48:07.350883 #12335] INFO -- : Refreshing Gem list
bundler: failed to load command: unicorn (/var/www/freemarket_sample_58d/shared/bundle/ruby/2.5.0/bin/unicorn)
LoadError: No such file to load -- aws-sdk-s3.rb
今回導入予定の無いaws-sdk
というパッケージに関連するエラーに遭遇。
確認したところ、
上記のようなgemでした。
検証計画
- 本番・ローカルでgemfile、gemfile lockの確認→記述なし
- 再起動・bundleinstallのし直し→変化なし
- S3導入時に変更した設定関連のファイルを確認→問題無さそう
(database.yml
/deploy.rb
/image_uploder
/unicorn.rb
/carrierwave.rb
/enviroment.rb
/capfile
など) - コミットを辿り自動デプロイできていたところまで遡る→できていたはずの段階でも同じエラー
- ★一度、 aws-sdk-s3を導入してみる
- git cloneをやり直し、環境構築
- EC2インスタンスの作成のし直し
一度手動でも同じエラーが出るか確認する
純粋に導入時に変更したファイルを修正するだけですが、備忘録として。
変更を加えるファイルは数少ないので3ステップで簡単に検証できます。
①まずはrails.conf
の参照するディレクトリのパスを変更した部分を戻す。
本番環境vimで開くnginxの設定ファイル。変更後、読み込みコマンド忘れずに
$ sudo vim /etc/nginx/conf.d/rails.conf
# ---Unicornと連携させる設定---
upstream app_server {
server unix:/var/www/appname/tmp/sockets/unicorn.sock;
# 導入後は下記の通りsharedで参照するようにしていた
# server unix:/var/www/appname/shared/tmp/sockets/unicorn.sock;
}
# 接続を受け付けるポート番号・接続を受け付けるリクエストURLなどサーバの設定
server {
listen 80;
server_name ※Elastic IP※;
# ---接続が来た際のrootディレクトリ---
root /var/www/appname/public;
# 導入後は下記の通りcurrentで参照するようにしていた
# root /var/www/appname/current/public;
# ---assetsファイルのアクセスに適用される設定---
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
# 導入後は下記を追加していたので削除かコメントアウト
# root /var/www/appname/current/public;
}
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
error_page 500 502 503 504 /500.html;
}
②次にunicorn.rb
の参照するディレクトリのパスを変更した部分を戻す。
# ---app_pathの定義---
app_path = File.expand_path('../../', __FILE__)
# app_path = File.expand_path('../../../', __FILE__)
# ---アプリケーションサーバの性能を決定---
worker_processes 1
working_directory app_path
# working_directory "#{app_path}/current"
# ---導入後はsharedの中を参照するようにしていた---
listen "#{app_path}/tmp/sockets/unicorn.sock"
pid "#{app_path}/tmp/pids/unicorn.pid"
stderr_path "#{app_path}/log/unicorn.stderr.log"
stdout_path "#{app_path}/log/unicorn.stdout.log"
# listen "#{app_path}/shared/tmp/sockets/unicorn.sock"
# pid "#{app_path}/shared/tmp/pids/unicorn.pid"
# stderr_path "#{app_path}/shared/log/unicorn.stderr.log"
# stdout_path "#{app_path}/shared/log/unicorn.stdout.log"
# ---Railsアプリケーションの応答を待つ上限時間の設定---
timeout 60
# 〜後略〜
# 中身をコメントアウト。全部で問題ない。
今回の場合、自動・手動に関わらず同じエラーでページが表示されませんでした。
解決
結局、導入することで解決。
Gemfileにaws-sdk
を追加、bundleinstall、merge、自動デプロイで本番環境にページ表示されるように。