Error: listen EACCES 0.0.0.0:80 OSx Node.js

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";
  }
}

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


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