新手问题 VPS 部署:capistrano 无法 start 服务器. unicorn 脚本 command not found

cqcn1991 · 2013年09月16日 · 最后由 cqcn1991 回复于 2013年09月19日 · 3976 次阅读

好不容易部署到了 linode。但是打开地址提示那一句注明的: “We're sorry, but something went wrong” 可是这下无从 debug 了。不知道哪里能看到具体的问题

我用了一个 cap task 来看问题

desc "tail production log files"
task :tail_logs, :roles => :app do
  trap("INT") { puts 'Interupted'; exit 0; }
  run "tail -f #{shared_path}/log/production.log" do |channel, stream, data|
    puts  # for an extra line break before the host name
    puts "#{channel[:host]}: #{data}"
    break if stream == :err
  end
end

但是只输入到一半就没反应了:

也不知道怎么办了。。。。

UPDATE: 现在的问题是,没有办法用 cap 来启动服务器

%w[start stop restart].each do |command|
  desc "#{command} unicorn server"
  task command, roles: :app, except: {no_release: true} do
   sudo "/etc/init.d/unicorn_#{application} #{command}"
    # run "/etc/init.d/unicorn_rails"
  end
end

这里是返回的结果 报的是 unicorn_myapp command not found

我想你部署到 linode 那应该是在本地 development 模式下跑通了的,我自己碰到这种情况也挺无语的... 所以给点 tips 哈

  1. 既然是 linode 拥有 ssh 权限,建议你登陆进去看 log . 先阶段 vim, grep, tail 等等自己熟悉的方式组合起来查比单独使用 tail 查询还是要方便不少。
  2. 想想刚刚学习 rails 的时候,碰到错误最多的就是 asset pipline
  3. 检查 MySQL 等相关后端程序

还有就是上面给的 log 信息有点少,也无法定位问题。

可以登录到 vps 上面检查下log目录下面的内容,应该会有收获

@cqcn1991 对呀,直接连进 vps 吧,这样更好

production 启动以后 tail -f log/production.log 然后页面点出错的链接或者是提交 看 console 吧

#3 楼 @hysios 进了 VPS 用 tail,返回的结果是一样的截图

#1 楼 @wppurking 我估计也是 asset pipline。因为这个图卡在 js 了……

@cqcn1991 其实你可以在 VPS 上 rails s RAILS_ENV=production 然后看 console 查问题

@cqcn1991 找 errro.log 500 出错通常不会显示在,production.log 里,一般在 /opt/nginx/log/error.log

#7 楼 @wppurking 确实是 asset 的问题,因为有用到静态图片,所以要开启 config.serve_static_assets = true。现在手动在 VPS 上 run rails s RAILS_ENV=production已经没有问题了。但是如果直接 cap deploy 在进 IP 地址(不加:3000)的话,还是报错。

不过能看到 run cap 的时候报这个问题 Cannot write a changed lockfile while frozen 和 : /etc/init.d/unicorn_myapp: Permission denied executing `deploy:restart' executing "/etc/init.d/unicorn_myapp restart" servers: ["106.186.30.85"] [106.186.30.85] executing command :: 106.186.30.85 sh: /etc/init.d/unicorn_myapp: Permission denied command finished in 822ms failed: "env PATH=$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH sh -c '/etc/init.d/u nicorn_myapp restart'" on 106.186.30.85

目测应该就是目前不能够用 cap 来 start server 估计还是 unicorn 和 windows 的问题,这个目前貌似无解? http://stackoverflow.com/questions/16199654/during-cap-deploycold-command-not-found-for-etc-init-d-unicorn

@cqcn1991 几个问题哈:

  1. 你 ssh 登录 VPS 使用的什么权限的账户?或者说用于启动 rails 项目的用户权限是什么?应该不是 root
  2. 你 launch rails 项目的方式是什么样的?nginx + unicorn ? 独立的 unicorn ? 感觉你是独立 unicorn.

我猜你是使用独立的 unicorn 绑定了 VPS 的 80 端口,同时通过 capistrano 部署使用的账户为飞 root 账户。其报告 : /etc/init.d/unicorn_myapp: Permission denied 是因为非 root 权限用户,在 linux 下只允许绑定 0~1023 端口.

所以部署 rails 项目一般都是不直接绑定 1023 以下的端口,这样

  • 避免非 root 权限用户无法绑定端口
  • 可以让当前服务器启动多个 web 应用服务器

所以会有让 nginx 挡在前面做反向代理。你可以先尝试让应用在 3000 端口跑起 production 环境。然后在去研究 nginx 的反向代理,因为反向代理不是 rails 的问题了。

#10 楼 @wppurking 看一下我的 UPDATE,我是按照 railscast 上面的教程来走的。刚才忘记更新了: 现在的实际问题就是,cap deploy:start 的时候,sudo: /etc/init.d/unicorn_myapp command not found。也就是说,Permission denied 的问题已经搞定了,但是现在报 command not found。

至于具体的部署的情况,nginx+unicorn 的组合,非 ROOT 部署(建了一个 deployer 账户)。 至于 Port,我还不知道怎么看额。但是在 cap 的 deploy 里面其实并没有写具体的 port,应该是有相关的默认值?

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