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!
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With