Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to bind to port 80, but running on the current shell works without any issues

I get the following error while trying to run "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)

Running the following command manually, does work without any issues. What could be the problem here?

rvmsudo unicorn_rails -c config/unicorn/production.rb -D --env production
like image 489
Rpj Avatar asked Jul 16 '13 08:07

Rpj


3 Answers

You need root access to bind to lower ports like port 80. Command rvmsudo executes in root context and therefore it works.

Cap task executes in a normal user context (probably deploy) depending on your configuration. You should add sudo ability to cap deploy user and make sure your cap task uses sudo to start unicorn.

like image 120
Iuri G. Avatar answered Oct 29 '22 21:10

Iuri G.


Answer by @Iuri G. gives you reason and possible solution.

I have another suggestion, unless you have extremely compelling reason to run Unicorn with port 80, change that to a higher port (>1024), like 3000. This will solve your problem.

If it is an application that is exposed to public, it is too easy to overwhelm Unicorn and make your application unavailable to end users. In such a case, do put Unicorn behind a proxy (like Nginx). The proxy will be on port 80 and Unicorn on a higher port.

like image 31
Deepak Kumar Avatar answered Oct 29 '22 23:10

Deepak Kumar


In my development environment, using RubyMine, I ran into this recently.

I used SSH to redirect port 80 to 8080.

sudo ssh -t -L 80:127.0.0.1:8080 [email protected]
like image 5
Adam Eberlin Avatar answered Oct 29 '22 23:10

Adam Eberlin