Unicorn не может записать PID-файл - PullRequest
17 голосов
/ 03 января 2012

Я использую развертывание приложения Ruby on Rails на Linode VPS с использованием Capistrano.Я использую 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

Я возвращаюсь и ArgumentError указывает, что путь к файлу pid недоступен для записи.

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"

Я развертываю с Capistrano под пользователем и группой 'deploy', и под этим также должен работать Unicorn.

Есть ли у кого-нибудь идеи, почему Unicorn не может выписать pid-файл?Любая помощь будет принята с благодарностью !!!

  • Майк

Ответы [ 3 ]

34 голосов
/ 03 января 2012

На самом деле, сообщение об ошибке уже сообщало вам, почему:

каталог для pid = / home / deploy / apps / shared / pids / unicorn.pid не доступен для записи

Итак, существует ли каталог /home/deploy/apps/shared/pids?Если нет, вы должны позвонить mkdir, чтобы создать его.

2 голосов
/ 08 июля 2013

Процесс Unicorn выполняется в фоновом режиме (-d), тип

ps aux | grep unicorn

и убейте запущенный процесс единорога, затем запустите снова.

1 голос
/ 08 января 2014

в Капистрано 3; если мы поменяем роли на: все, то при развертывании капистрано говорят; <code>WARN [SKIPPING] No Matching Host for ..... и после развертывания все символические ссылки больше не работают. А если папка tmp / pids в массиве символьных ссылок, то единорог не может найти папку 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 }

...