启动Unicorn时不允许操作

我已经在Ubuntu(Amazon EC2)上创build了一个nginx / unicorn / capistrato安装程序,主要遵循本指南 。 我猜一切都是应该设置的,但是当我启动Unicorn时,我在日志中得到了这个错误(很多):

E, [2012-09-08T08:57:20.658092 #12356] ERROR -- : Operation not permitted (Errno::EPERM) /home/deployer/apps/bridgekalenderen.no/shared/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn/worker.rb:82:in `initgroups' 

我看到它与用户的权限有关,但我无法弄清楚我所遗漏的内容。 服务器启动很好,如果我用sudo(或者rvmsudo,真的)启动它。

用户具有sudofunction,我已经chmod了几次应用程序,所以文件权限应该没问题。 / tmp中的独angular兽套接字由部署者用户拥有,所以不应该成为问题。

有人有线索在哪里看?

更新:

经过一番挖掘,我发现它归结为一个调用Process.initgroups抛出EPERM。 我已经通过irbvalidation了这一点。 我无法弄清楚是什么原因导致了错误。 用户可以读取/etc/group

    如果我理解你的话,你正试图在没有sudo下启动一个服务。 这不会工作,并会给你的错误,如你收到的操作不允许 。 大多数情况下(如果不是全部的话)都是如此,因为任何服务都需要以下一项或多项工作:

    1. 绑定/监听端口<1024。
    2. 读取非root用户不可读的文件。
    3. 写入不可由非root用户写入的文件。
    4. 并可能更多(我不记得)。

    我终于弄明白了。 问题是部署者用户的主要组是错误的。 它应该是“员工”,而不是“部署者”。 这意味着独angular兽会尝试将新工作进程的所有权移交给它应该使用的组,但是只有root可以做到这一点。

    为了以防其他人需要知道,我通过像这样编辑/etc/passwd更改主组:

     deployer:x:1002:50:,,,:/home/deployer:/bin/bash 

    '50'是'工作人员'的gid。 开始是1002。 为了得到“工作人员”小组的gid,请执行以下操作:

     cat /etc/group | grep staff 

    它会说一些话:

     staff:x:50:<comma separated list of users in this group> 

    gid是'x'之后的数字。

    我遇到了同样的问题。 最后为我工作的是在after_fork do |server, worker|独angular兽configuration中设置以下内容 块:(这是从github独angular兽configuration)

      begin uid, gid = Process.euid, Process.egid user, group = 'deployer', 'staff' target_uid = Etc.getpwnam(user).uid target_gid = Etc.getgrnam(group).gid worker.tmp.chown(target_uid, target_gid) if uid != target_uid || gid != target_gid Process.initgroups(user, target_gid) Process::GID.change_privilege(target_gid) Process::UID.change_privilege(target_uid) end rescue => e if RAILS_ENV == 'development' STDERR.puts "couldn't change user, oh well" else raise e end end