I've written a web-server using Node.js. When I tried to test my server with the tester I've written for it, I succeed only if the port I'm using for the server is not 80. I've checked on netstat, and no other application is using port 80. The error I'm getting on the console is:
Error: connect ECONNREFUSED
at errnoException (net.js:640:11)
at Object.afterConnect [as oncomplete] (net.js:631:18)
What can be done in this case?
You should not make a habit of running node as a privileged user. Here is a method I'm using on 6 different machines:
Use iptables
to forward incoming traffic on port 80 to 8080 like so:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
Then be sure to save that
sudo iptables-save
Youd also want to add that to rc.local so those are set at reboot or instance launch (in the case of EC2 or other cloud)
Then you can safely start node listening on 8080 as any user.
This is basically an addition to the answer from maerics, but since I want to add a code example I write another answer with additional information how to prevent security problems.
Usually web servers are started as root, because this is needed to bind on ports below 1024, but then they change the user they run under to an not privileged user.
You can do this with node.js using process.setuid("username")
.
The following example starts the server and then drop the root permissions to the user "www-data" after it bound itself to port 80 when started as root:
function StartServer() {
console.log("Starting server...");
// Initalizations such as reading the config file, etc.
server = http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
});
try {
server.listen(80, "0.0.0.0", function(){
process.setuid("www-data");
});
}
catch(err) {
console.error("Error: [%s] Call: [%s]", err.message, err.syscall);
process.exit(1);
}
}
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