Rails Unicorn 的 restart 杀不了老的进程。。。。

leveyzhu · 2012年03月29日 · 最后由 pobing 回复于 2012年04月01日 · 5216 次阅读

Unicorn 的 restart 杀不了老的进程,导致每次 deploy 都是 502,得自己手动 kill 谁知道什么原因吗?unicorn.rb 的配置是:

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

  old_pid = "#{shared_path}/tmp/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
    end
  end
end

代码需要排下版,另外需要再提供一些信息才能找到原因

bundle install 试试,可能你在生产环境有些 gem 包没有装

手动 rails s -e production 看看能否跑起来

unicorn 你是怎么 restart 的? 这里是 ruby-china 的 deploy.rb

我建议你自行到服务器上执行下面命令,然后通过 ps 查看进程是自动被重启。

cd your/project/path

ps aux | grep unicorn

kill -USR2 `cat #{deploy_to}/current/tmp/pids/unicorn.pid`

ps aux | grep unicorn

注意观察前后 unicorn 的 unicorn master 的 pid 前后跟 tmp/unicorn.pid 是否一致。

#2 楼 @dxdxdx #3 楼 @huacnlee #4 楼 @lgn21st 是这样的:部署是可以的,但是每次 deploy 的时候,虽然前后 pid 不一样,但是还是会 502,只能手动 kill 掉 pid 和 oldpid(-QUIT),然后重新 deploy:start 一次,才行。。

#5 楼 @LeveyZhu 那么你的 Unicron 应该没有问题,502 是 Nginx 无法检测到后端的 Unicron 进程,不妨贴一下你的 Nginx 中的配置吧?

#6 楼 @lgn21st

upstream yourstorymysong {
  server unix:/home/web/apps/yourstorymysong/current/tmp/sockets/unicorn.sock fail_timeout=0;
}

server {
    listen 80 default;
    server_name www.yourstorymysong.com;
    root /home/web/apps/yourstorymysong/current/public;
    access_log off;
    rewrite_log on;

    location / {
        proxy_pass  http://yourstorymysong;
        proxy_redirect     off;

        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        client_max_body_size       10m;
        client_body_buffer_size    128k;

        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;

        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }
    location ~ ^/(assets)/  {
        gzip_static on; # to serve pre-gzipped version
        expires max;
        add_header Cache-Control public;
    }
    location = /favicon.ico {
        expires max;
        add_header Cache-Control public;
    }
}

这个是写在 sites-enabled 里的

#7 楼 @LeveyZhu 看不出什么问题,而且你的 Nginx 配置非常规范且完整,怀疑是否是权限的原因。 还有你在主题帖中是否贴出了完整的 unicorn.rb ? 可否对比参考下 ruby-china 的 unicorn.rb

另外如果你不通过 cap deploy,而是直接到 server 上,手动执行 kill -USR2 pid 也是一样的问题?

#9 楼 @lgn21st 手动 kill -USR2 pid 可以的。。。

#10 楼 @LeveyZhu 那么你查一下cap deploy到底跟你手动执行差在那里了?仔细查 log 应该能查出来,cap deploy 跟你手动输入一系列命令其实没有本质区别。

#11 楼 @lgn21st 你好,lgn21st,我的 unicorn 重启脚本和 ruby-china 的 unicorn.rb 配置相差无几,以前重启脚本执行可以更新代码,现在虽然 unicorn 重启了,重启前后 unicorn_rails 的进程 pid 也变化了 但页面无更新,重启脚本代码: kill -USR2 cat /appath/shared/tmp/pids/unicorn.pid

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