部署 Unicorn 启动报错

hiveer · 2013年12月02日 · 最后由 hiveer 回复于 2013年12月06日 · 2816 次阅读

最近在发布的时候出现了这个错误,自己搞整了一天无果... unicorn 配置:

require 'ohm'
require 'ohm/contrib'

worker_processes 4

deploy_to = "/var/games"
application = "web20"

working_directory "#{deploy_to}/#{application}/current"
#app_path "#{deploy_to}/#{application}/current"

listen "/tmp/#{application}.sock", :backlog => 256

timeout 300

pid "#{deploy_to}/#{application}/shared/pids/unicorn.pid"

stderr_path "#{deploy_to}/#{application}/shared/log/unicorn.stderr.log"
stdout_path "#{deploy_to}/#{application}/shared/log/unicorn.stdout.log"

preload_app true

GC.respond_to?(:copy_on_write_friendly=) and
  GC.copy_on_write_friendly = true

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

  Redis.current.quit
  sleep(2)
end

after_fork do |server, worker|
  Redis.current = Redis.new :host => '127.0.0.1', :port => 6789, :driver => :hiredis
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

不是写了ERROR: Cannot allocate memory吗?是不是你的内存占用太高了

似乎不是这个问题,已经查过了内存是够的

#1 楼 @Martin91 第一个 ERROR 后面的那点信息怎么解释呢

#3 楼 @hiveer 你把你的 Unicorn 的配置文件贴上来看一下吧

你 kill 失败 找不到 gemfile 路径 每次跟新将 gemfile 知道到当前版本的路径就 okl

#5 楼 @jhy_0326

before_fork do |server, worker|
  ENV['BUNDLE_GEMFILE'] = "#{working_directory}/Gemfile"
  old_pid = "#{deploy_to}/#{application}/shared/pids/unicorn.pid.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
      puts "Send 'QUIT' signal to unicorn error!"
    end
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!

  Redis.current.quit
  sleep(2)
end

这样可以吗?

事实证明代码没得问题,是因为系统的内存不够了,所以在 fork worker 的时候没有足够的内存导致错误。但是,path_to/bin/unicorn:no such file or directory - 这个提示出现的原因暂时还没有搞清楚。Thanks for every answer.

需要 登录 后方可回复, 如果你还没有账号请 注册新账号