LoginSignup
mymskr1027
@mymskr1027

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Capistrano自動デプロイ時の502エラー

ruby on rails初学者です。

手動デプロイ、Nginxの設定は済んでいますが、Capistranoで自動デプロイを実行したところ、502 Bad gatewayのエラーが出て詰まっています。
自動デプロイ後にcurrentディレクトリが作成される認識ですが、エラーログを確認しようとEC2側でcurrentディレクトリに移動しようとすると、no such file or directory: current と表示されてしまいます。

自動デプロイを実行した画面は下記で、デプロイ自体は成功している認識なのですがあってますでしょうか。

発生している問題・エラー

00:53 deploy:assets:backup_manifest
      01 mkdir -p /var/www/app_name/releases/20210502224248/assets_manifest_backup
    ✔ 01 ec2-user@xx.xxx.xxx.xxx 0.123s
      02 cp /var/www/app_name/releases/20210502224248/public/assets/.sprockets-manifest-d9815ef5061edc1f5133a83421dafb39.json /var/www/app_name/releases/20210502224248/assets_manifest_backup
    ✔ 02 ec2-user@xx.xxx.xxx.xxx 0.129s
00:54 deploy:migrate
      [deploy:migrate] Run `rake db:migrate`
00:54 deploy:migrating
      01 $HOME/.rbenv/bin/rbenv exec bundle exec rake db:migrate
    ✔ 01 ec2-user@xx.xxx.xxx.xxx 1.811s
00:56 deploy:symlink:release
      01 ln -s /var/www/app_name/releases/20210502224248 /var/www/app_name/releases/current
    ✔ 01 ec2-user@xx.xxx.xxx.xxx 0.139s
      02 mv /var/www/app_name/releases/current /var/www/app_name
    ✔ 02 ec2-user@xx.xxx.xxx.xxx 0.128s
00:56 unicorn:start
      01 $HOME/.rbenv/bin/rbenv exec bundle exec unicorn -c /var/www/app_name/current/config/unicorn.rb -E deployment -D 
    ✔ 01 ec2-user@xx.xxx.xxx.xxx 1.628s
      unicorn restarting...
      02 kill -s USR2 `cat /var/www/app_name/shared/tmp/pids/unicorn.pid`
    ✔ 02 ec2-user@xx.xxx.xxx.xxx 0.132s
00:58 deploy:cleanup
      Keeping 5 of 6 deployed releases on xx.xxx.xxx.xxx
      01 rm -rf /var/www/app_name/releases/20210501125235
    ✔ 01 ec2-user@xx.xxx.xxx.xxx 1.367s
01:00 deploy:log_revision
      01 echo "Branch master (at f36ae5f5de6da628e4f4d3f84ba5994fc505539a) deployed as release 20210502224248 by user" >> /var/www/app_name/revisions.log
    ✔ 01 ec2-user@xx.xxx.xxx.xxx 0.126s

config/unicorn.rbとNginxのファイルの設定は下記です。

config/unicorn.rb

app_path = File.expand_path('../../../', __FILE__)

worker_processes 1

working_directory "#{app_path}/current" 

pid "#{app_path}/shared/tmp/pids/unicorn.pid" 

listen "#{app_path}/shared/tmp/sockets/unicorn.sock"

stderr_path "#{app_path}/shared/log/unicorn.stderr.log" 

stdout_path "#{app_path}/shared/log/unicorn.stdout.log"

timeout 60

preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true

check_client_connection false

run_once = true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) &&
    ActiveRecord::Base.connection.disconnect!

  if run_once
    run_once = false # prevent from firing again
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exist?(old_pid) && server.pid != old_pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH => e
      logger.error e
    end
  end
end

after_fork do |_server, _worker|
  defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end

/etc/nginx/conf.d/rails.conf

upstream app_server {
  server unix:/var/www/app_name/shared/tmp/sockets/unicorn.sock;
}

server {
  listen 80;
  server_name xx.xxx.xxx.xxx;
  client_max_body_size 2g;

  root /var/www/app_name/current/public;

# assetsファイル(CSSやJavaScriptのファイルなど)にアクセスが来た際に適用される設定
  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    root /var/www/app_name/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;
}

理解不足な点があるかと思いますが、どなたかご教示いただけますと幸いです。

0

2Answer

HTTP のレスポンスコードの 502 Bad gateway というのは、中間にあるサーバ(リバースプロキシ―とか、ロードバランサ―とか、その他)が、その奥にあるサーバ(普通はWebサーバ。リバースプロキシ―などが多段にあるケースだと、さらに奥のリバースプロキシ―などのケースもある)との通信で無効なレスポンスが返された場合に返されるものです。

どのような操作をしたときに 502 が出たのかわかりませんが、デプロイは正常に終了して、その後にブラウザでアクセスしたときに出たのでしょうか?

また、どのようなネットワーク構成になっているのかわからないので詳しいことは言えませんが、タグから見ると EC2 を使っているようなので、ロードバランサ―経由でEC2にアクセスしている場合には、以下のサイトが参考になるかもしれません。

0
00:56 deploy:symlink:release
      01 ln -s /var/www/app_name/releases/20210502224248 /var/www/app_name/releases/current
    ✔ 01 ec2-user@xx.xxx.xxx.xxx 0.139s
      02 mv /var/www/app_name/releases/current /var/www/app_name
    ✔ 02 ec2-user@xx.xxx.xxx.xxx 0.128s

この部分があるので,/var/www/app_name/current -> /var/www/app_name/releases/20210502224248 が作成されているように読めます.

EC2側でcurrentディレクトリに移動しようとすると、no such file or directory: current と表示されてしまいます。

とありますが,例えば以下のように絶対パスにて移動しても駄目でしょうか?

$ cd /var/www/app_name/current
0

Your answer might help someone💌