Unicorn无法写pid文件

我正在使用Capistrano将Ruby on Rails应用程序部署到Linode VPS。 我使用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,这也是Unicorn应该运行的。

有没有人有任何想法为什么Unicorn不能写出pid文件? 任何帮助将不胜感激!!!

  • 麦克风

实际上,错误消息已告诉您原因:

目录为pid = / home / deploy / apps / shared / pids / unicorn.pid不可写

那么,目录/home/deploy/apps/shared/pids存在? 如果没有,你应该调用mkdir来创建它。

Unicorn进程在后台运行(-d),类型

 ps aux | grep unicorn 

并杀死运行独角兽进程然后再次启动。

在卡皮斯特拉诺3; 如果我们将角色更改为:all,那么在部署capistrano时说; WARN [SKIPPING] No Matching Host for .....并且在部署之后所有的符号链接都不再工作了。 如果在symlink数组中有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 }