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

Rpj*_*Rpj 13 sudo capistrano ruby-on-rails 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)
Run Code Online (Sandbox Code Playgroud)

手动运行以下命令可以正常运行.这可能是什么问题?

rvmsudo unicorn_rails -c config/unicorn/production.rb -D --env production
Run Code Online (Sandbox Code Playgroud)

Iur*_* G. 9

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

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


Dee*_*mar 7

回答@Iuri G.给你理由和可能的解决方案.

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

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


Ada*_*lin 5

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

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

sudo ssh -t -L 80:127.0.0.1:8080 user@0.0.0.0
Run Code Online (Sandbox Code Playgroud)