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