Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error: listen EACCES 0.0.0.0:80 OSx Node.js

I'm following a tutorial in a angularJS book and have to setup a server. This is the server.js file:

 var express = require('express');
  var app = express();
   app.use('/', express.static('./'));
    app.listen(80);

I get this error:

$ node server.js
events.js:154
      throw er; // Unhandled 'error' event
      ^

Error: listen EACCES 0.0.0.0:80

I know already, that the Error EACCES means that i don't have access rights to the port 80, but i don't know how to fix this. Any help much appreciated!

like image 930
olivier Avatar asked Jan 28 '16 18:01

olivier


4 Answers

If you need to run the server on port 80 you should use a reverse proxy like nginx that will run using a system account on a privileged port and proxy the requests to your Node.js server running on an unprivileged port (> 1024).

When running in development environment you're pretty much free to run as root (ie. sudo node server.js), but that is rather dangerous in production environment.

Here's a sample nginx config that will see if the request is for a file that exists in the filesystem, and if not, proxy the request to your Node.js server running on port 9000

upstream yournodeapp {
  server localhost:9000 fail_timeout=0;
  keepalive 60;
}

server {
  server_name localhost;
  listen 80 default_server;

  # Serve static assets from this folder
  root /home/user/project/public;

  location / {
    try_files $uri @yournodeapp;
  }

  location @yournodeapp {
    proxy_pass http://yournodeapp;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}
like image 73
vesse Avatar answered Oct 20 '22 17:10

vesse


to give root access to node and start server on port 80 you can do

sudo node app.js

this will start the server giving permission on port 80

like image 30
DeveloperCoding Avatar answered Oct 20 '22 16:10

DeveloperCoding


Foremost, do not run as root. That's asking for 'it'. "It" is really bad. Go see the movie. Then, don't run your node web project as root.

// DO NOT DO THIS!
$ sudo node app.js

// DO NOT DO THIS EITHER!
$ sudo su -
# node app.js

Instead, use PM2 and authbind to do this:

// %user% is whatever user is running your code
sudo touch /etc/authbind/byport/80
sudo chown %user% /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80

Next, add this alias to your ~/.bash_aliases or ~/.bashrc or ~/.bash_profile:

alias pm2='authbind --deep pm2'

Then, try it with pm2:

pm2 start app.js
like image 20
4Z4T4R Avatar answered Oct 20 '22 15:10

4Z4T4R


On Windows I fixed this by setting Express to listen on port 8080 for HTTP and 8443 for HTTPS. It really doesn't like using those lower number ports. Also I have IIS installed and running so it might be some sort of port conflict there too.

like image 2
Josh P Avatar answered Oct 20 '22 16:10

Josh P