14

尝试运行时出现以下错误“ cap production unicorn:start

F, [2013-07-12T04:36:18.134045 #28998] FATAL -- : error adding listener addr=0.0.0.0:80
/home/ec2-user/apps/foo_prod/shared/bundle/ruby/2.0.0/gems/unicorn-4.6.3/lib/unicorn/socket_helper.rb:147:in `initialize': Permission denied - bind(2) (Errno::EACCES)

手动运行以下命令,确实没有任何问题。这里可能是什么问题?

rvmsudo unicorn_rails -c config/unicorn/production.rb -D --env production
4

4 回答 4

9

您需要root 访问权限才能绑定到较低的端口,例如 port 80。命令rvmsudo在根上下文中执行,因此它可以工作。

根据您的配置,Cap 任务在普通用户上下文(可能是部署)中执行。您应该添加 sudo 功能来 cap deploy user 并确保您的 cap 任务用于sudostart unicorn

于 2013-07-17T16:06:42.657 回答
8

@Iuri G. 的回答为您提供了理由和可能的解决方案。

我有另一个建议,除非你有非常令人信服的理由使用端口 80 运行 Unicorn,否则将其更改为更高的端口 (>1024),例如 3000。这将解决你的问题。

如果它是一个公开的应用程序,那么很容易压倒 Unicorn 并使您的应用程序对最终用户不可用。在这种情况下,请务必将 Unicorn 放在代理后面(如 Nginx)。代理将在端口 80 上,而 Unicorn 将在更高的端口上。

于 2013-07-22T03:57:11.130 回答
4

在我的开发环境中,使用 RubyMine,我最近遇到了这个问题。

我使用 SSH 将端口 80 重定向到 8080。

sudo ssh -t -L 80:127.0.0.1:8080 user@0.0.0.0
于 2014-07-02T17:50:07.573 回答
1

我假设您将 Ubuntu 作为生产服务器运行。在您的服务器上,您需要编辑您的sudoers文件:

首先输入select-editor并选择 nano(或您觉得舒服的其他编辑器)

然后在文件的底部,在该include行之前,添加以下行:

%deployer ALL=(ALL)NOPASSWD:/path/to/your/unicorn_rails

您需要deployer用 capistrano 使用的用户名替换,并/path/to/your/unicorn_rails用正确的路径替换。这将允许您的部署用户“sudo unicorn_rails”而无需提示输入密码。

最后编辑您的unicorn:startcapistrano 任务,并在rvmsudo启动 unicorn 的命令行之前添加:

rvmsudo unicorn_rails -c config/unicorn/production.rb -D --env production

如果它不起作用,你可以试试这个

bundle exec sudo unicorn_rails -c config/unicorn/production.rb -D --env production
于 2013-07-26T00:58:14.767 回答