質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

capistranoでunicornを起動する際に間違った参照先でコマンドが実行されてしまいます。参照先を正しくするための方法を教えてください。

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,285

yamatora

score 11

capistranoを使用してデプロイを試みているのですが
unicornを起動する箇所でなぜか/var/www/my_app/current/config/unicorn/staging.rbを参照してしまっています

bundle exec unicorn -c /var/www/my_app/current/config/unicorn/staging.rb -E staging -D

本当でしたら

/var/www/vhosts/mydomain/current/config/unicorn/staging.rb

を参照する必要があるのですがunicorn.rakeというファイルで明示的に

/var/www/vhosts/mydomain/current/unicorn/staging.rb

を指定してもなぜか/var/www/my_app以下が参照されてしまいます。
この解決方法を教えてください。
よろしくお願いいたします。

$ cap staging deploy を実行すると以下のように出力されます

・
・
・
DEBUG [9d6821ae] Command: cd /var/www/vhosts/mydomain/current && ( export RBENV_ROOT="/usr/local/rbenv" RBENV_VERSION="2.2.3" RAILS_ENV="staging" ; RBENV_ROOT=/usr/local/rbenv RBENV_VERSION=2.2.3 /usr/local/rbenv/bin/rbenv exec bundle exec unicorn -c /var/www/my_app/current/config/unicorn/staging.rb -E staging -D  )
DEBUG [9d6821ae]     bundler: failed to load command: unicorn (/var/www/vhosts/mydomain/shared/bundle/ruby/2.2.0/bin/unicorn)
DEBUG [9d6821ae]     Errno::ENOENT: No such file or directory @ rb_sysopen - /var/www/my_app/current/config/unicorn/staging.rb

config/deploy.rb

# config valid only for Capistrano 3.1
lock '3.2.1'

set :application, 'my_app'
set :repo_url, 'git@github.com:me/my_app.git'
set :keep_releases, 5

set :rbenv_type, :system # :system or :user
set :rbenv_ruby, '2.2.3'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
set :rbenv_map_bins, %w{rake gem bundle ruby rails}
set :rbenv_roles, :all # default value

set :linked_files, %w{config/database.yml config/secrets.yml}
set :linked_dirs, %w{bin log tmp/backup tmp/pids tmp/cache tmp/sockets vendor/bundle}

set :unicorn_pid, "#{shared_path}/tmp/pids/unicorn.pid"
set :unicorn_config_path, "#{release_path}/config/unicorn/staging.rb"

set :bundle_jobs, 4
set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:stage)}" }

after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  # アプリの再起動を行うタスク
  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      execute :mkdir, '-p', release_path.join('tmp')
      execute :touch, release_path.join('tmp/restart.txt')
    end
  end

  # linked_files で使用するファイルをアップロードするタスク
  # deployが行われる前に実行する必要がある。
  desc 'upload importabt files'
  task :upload do
    on roles(:app) do |host|
      execute :mkdir, '-p', "#{shared_path}/config"
      upload!('config/database.yml',"#{shared_path}/config/database.yml")
      upload!('config/secrets.yml',"#{shared_path}/config/secrets.yml")
    end
  end

  # webサーバー再起動時にキャッシュを削除する
  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      # Here we can do anything such as:
      within release_path do
        execute :rm, '-rf', release_path.join('tmp/cache')
      end
    end
  end

  # Flow の before, after のタイミングで上記タスクを実行
  before :started, 'deploy:upload'
  after :finishing, 'deploy:cleanup'

  # Unicorn 再起動タスク
  desc 'Restart application'
  task :restart do
    invoke 'unicorn:restart' # lib/capistrano/tasks/unicorn.cap 内処理を実行
  end
end

lib/capistrano/tasks/unicorn.rake
このファイル内のunicorn_configで対象のファイルを指定できている?と思っています。

namespace :unicorn do
  task :environment do
    set :unicorn_pid, "#{shared_path}/tmp/pids/unicorn.pid"
    set :unicorn_config, "/var/www/vhosts/mydomain/current/config/unicorn/#{fetch(:rails_env)}.rb"
  end

  def start_unicorn
    within current_path do
      execute :bundle, :exec, :unicorn, "-c #{fetch(:unicorn_config)} -E #{fetch(:rails_env)} -D"
    end
  end

  desc "Start unicorn server"
  task :start => :environment do
    on roles(:app) do
      start_unicorn
    end
  end
end

config/unicorn/staging.rb

app_path = '/var/www/vhosts/mydomain'

worker_processes 2
working_directory "#{app_path}" + "/current"

preload_app true
timeout 30

listen "#{app_path}/shared/tmp/sockets/unicorn.sock", :backlog => 64

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

stderr_path "#{app_path}/current/log/unicorn.stderr.log"
stdout_path "#{app_path}/current/log/unicorn.stdout.log"

before_exec do |server|
  ENV['BUNDLE_GEMFILE'] = "#{app_path}/current/Gemfile"
end

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
  old_pid = "#{app_path}/shared/tmp/pids/unicorn.pid.oldbin"
  if File.exists?(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
      # someone else did our job for us
    end
  end
  sleep 1
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

Capfileに以下を追加

Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Rubyに関する質問
  • capistranoでunicornを起動する際に間違った参照先でコマンドが実行されてしまいます。参照先を正しくするための方法を教えてください。