web-dev-qa-db-ja.com

Unicornがpidファイルを書き込めません

Ruby on RailsアプリをCapistranoを使用してLinodeVPSにデプロイしています。アプリケーションサーバーとしてUnicornを使用し、プロキシとしてNginxを使用しています。問題明らかな権限の問題のためにUnicornを起動できませんが、追跡するのに苦労しています。

Unicornは、次のCapistranoタスクの使用を開始します。

task :start, :roles => :app, :except => { :no_release => true } do
    run <<-CMD
      cd #{current_path} && #{Unicorn_bin} -c #{Unicorn_config} -E #{Rails_env} -D
    CMD
end

戻ってきて、pidファイルへのパスが書き込めないことを示すArgumentErrorが返されます。

cap Unicorn:start                                                                           master [d4447d3] modified
  * executing `Unicorn:start'
  * executing "cd /home/deploy/apps/gogy/current && /home/deploy/apps/gogy/current/bin/Unicorn -c /home/deploy/apps/gogy/shared/config/Unicorn.rb -E production -D"
    servers: ["66.228.52.4"]
    [66.228.52.4] executing command
 ** [out :: 66.228.52.4] /home/deploy/apps/gogy/shared/bundle/Ruby/1.8/gems/Unicorn-4.1.1/lib/Unicorn/configurator.rb:88:in `reload':
 ** [out :: 66.228.52.4] directory for pid=/home/deploy/apps/shared/pids/Unicorn.pid not writable (ArgumentError)
 ** [out :: 66.228.52.4] from /home/deploy/apps/gogy/shared/bundle/Ruby/1.8/gems/Unicorn-4.1.1/lib/Unicorn/configurator.rb:84:in `each'
 ** [out :: 66.228.52.4] from /home/deploy/apps/gogy/shared/bundle/Ruby/1.8/gems/Unicorn-4.1.1/lib/Unicorn/configurator.rb:84:in `reload'
 ** [out :: 66.228.52.4] from /home/deploy/apps/gogy/shared/bundle/Ruby/1.8/gems/Unicorn-4.1.1/lib/Unicorn/configurator.rb:65:in `initialize'
 ** [out :: 66.228.52.4] from /home/deploy/apps/gogy/shared/bundle/Ruby/1.8/gems/Unicorn-4.1.1/lib/Unicorn/http_server.rb:102:in `new'
 ** [out :: 66.228.52.4] from /home/deploy/apps/gogy/shared/bundle/Ruby/1.8/gems/Unicorn-4.1.1/lib/Unicorn/http_server.rb:102:in `initialize'
 ** [out :: 66.228.52.4] from /home/deploy/apps/gogy/shared/bundle/Ruby/1.8/gems/Unicorn-4.1.1/bin/Unicorn:121:in `new'
 ** [out :: 66.228.52.4] from /home/deploy/apps/gogy/shared/bundle/Ruby/1.8/gems/Unicorn-4.1.1/bin/Unicorn:121
 ** [out :: 66.228.52.4] from /home/deploy/apps/gogy/current/bin/Unicorn:16:in `load'
 ** [out :: 66.228.52.4] from /home/deploy/apps/gogy/current/bin/Unicorn:16
 ** [out :: 66.228.52.4] master failed to start, check stderr log for details
    command finished in 1032ms
failed: "rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-Shell 'default' -c 'cd /home/deploy/apps/gogy/current && /home/deploy/apps/gogy/current/bin/Unicorn -c /home/deploy/apps/gogy/shared/config/Unicorn.rb -E production -D'" on 66.228.52.4

最後に、これが私のUnicorn構成ファイル(Unicorn.rb)の関連セクションです。

# Ensure that we're running in the production environment
Rails_env = ENV['Rails_ENV'] || 'production'

# User to run under
user 'deploy', 'deploy'

# We will spawn off two worker processes and one master process
worker_processes 2

# set the default working directory
working_directory "/home/deploy/apps/gogy/current"

# This loads the application in the master process before forking
# worker processes
# Read more about it here:
# http://Unicorn.bogomips.org/Unicorn/Configurator.html
preload_app true

timeout 30

# This is where we specify the socket.
# We will point the upstream Nginx module to this socket later on
listen "/home/deploy/apps/shared/sockets/Unicorn.sock", :backlog => 64

pid "/home/deploy/apps/shared/pids/Unicorn.pid"

# Set the path of the log files 
stderr_path "/home/deploy/apps/gogy/current/log/Unicorn.stderr.log"
stdout_path "/home/deploy/apps/gogy/current/log/Unicorn.stdout.log"

私は「deploy」ユーザーとグループの下でCapistranoを使用してデプロイしています。これは、Unicornも実行する必要があるものです。

Unicornがpidファイルを書き出せない理由を誰かが知っていますか?どんな助けでも大歓迎です!!!

  • マイク
17
Mike Filbin

実際、エラーメッセージはすでに理由を示しています。

pid =/home/deploy/apps/shared/pids /Unicorn.pidのディレクトリは書き込み可能ではありません

それで、ディレクトリは/home/deploy/apps/shared/pids存在しますか?そうでない場合は、mkdirを呼び出して作成する必要があります。

34
Limbo Peng

ユニコーンプロセスはバックグラウンドで実行されています(-d)、タイプ

ps aux | grep Unicorn

実行中のUnicornプロセスを強制終了してから、もう一度開始します。

2
Pravin Mishra

capistrano3で;ロールを:allに変更すると、デプロイメントのcapistranoが次のように言います。 WARN [SKIPPING] No Matching Host for .....</ code> 展開後、すべてのシンボリックリンクが機能しなくなります。また、シンボリックリンク配列にtmp/pidsフォルダーがある場合、Unicornはtmp/pidsフォルダーを見つけることができず、Unicorn.pidは書き込み可能ではないと言っています。

したがって、使用する必要があります。 roles: %w{web app db} の代わりに roles :all

Production.rbのサンプルサーバーライン。

server 'YOUR_SERVER_IP', user: 'YOUR_DEPLOY_USER', roles: %w{web app db}, ssh_options: { forward_agent: true }

1
Farukca