无法绑定到端口80,但在当前shell上运行没有任何问题

时间:2013-07-16 08:48:12

标签: ruby-on-rails capistrano sudo unicorn rvm-capistrano

尝试运行“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 个答案:

答案 0 :(得分:9)

您需要 root access 绑定到端口80等较低端口。命令rvmsudo在根上下文中执行,因此它可以工作。

Cap任务在普通用户上下文(可能是部署)中执行,具体取决于您的配置。您应该添加sudo功能以限制部署用户,并确保您的上限任务使用sudo启动unicorn

答案 1 :(得分:7)

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

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

如果它是一个暴露给公众的应用程序,那么很容易压倒Unicorn并使最终用户无法使用您的应用程序。在这种情况下,确实将Unicorn放在代理(如Nginx)之后。代理将在端口80上,Unicorn在更高端口上。

答案 2 :(得分:4)

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

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

sudo ssh -t -L 80:127.0.0.1:8080 user@0.0.0.0

答案 3 :(得分:1)

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

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

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

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

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

最后编辑unicorn:start capistrano任务,并在启动独角兽的命令行之前添加rvmsudo

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

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

bundle exec sudo unicorn_rails -c config/unicorn/production.rb -D --env production