listen EADDRINUSE: address already in use 0.0.0.0:80 - node.js

Error: listen EADDRINUSE: address already in use 0.0.0.0:80
code: 'EADDRINUSE',
errno: -4091,
syscall: 'listen',
address: '0.0.0.0',
port: 80
getting these error while running the command "npm run env-debug"
how can I resolve these.

It's because the port 80 is typically reserved for tcp and http communication. Use different ports like 5000, 3000 etc.
See details here Wikipedia port 80

One of the processes is using port 80. Also, it depends on the OS. Generally, you can not access ports below 1024 without root or admin authorization.
Check which process is using port 80. Most web servers use 80 ports like apache or Nginx.
Windows: Check Ports
Linux: Check Ports
Kill the process using port 80 and you are good to go if you have root privileges.
But, you should never run the node.js app on port 80 with root privileges. It is not recommended to run any server software as root. Run your app on some other port like 80 and use a reverse proxy like Nginx to map it.

Related

HAProxy configuration ports issue

Hi :) I have problem with HAProxy configuration. I have haproxy and two backend servers (backend servers listen on 1234 port)
It's my haproxu config:
frontend http_front
bind *:80
backend http_back
balance roundrobin
server server1 10.0.0.2:1234
server server2 10.0.0.3:1234
This config doesn't work, but when i add to frontend:
bind *:1234
It works great - i don't understand it because bind *:1234 inform only haproxy to listen on 1234 port nothing more. Have you any advices or explanations ?
Port 80 is a privileged port, this means that you can only start haproxy as root when you want that haproxy should listen on port 80.
Another reason could be that there is another server listen on port 80. Maybe a web server run also on this machine which listens on port 80.

Node.js: Making Hello World page public

I copied the Hello World example from
https://nodejs.org/en/about/
and it works fine on my Ubuntu cloud instance. Now I'd like to make the Hello World page visible to the entire Internet. What changes are required to the code to accomplish this?
Update: When port is set to 80 and hostname is set to the instance IP address, the following errors are generated when attempting to initiate a node.js session:
ubuntu#instance04:~/NodeJS/NodeHW$ node index01
events.js:183
throw er; // Unhandled 'error' event
^
Error: listen EACCES <my_ip_address>:80
at Object._errnoException (util.js:1022:11)
at _exceptionWithHostPort (util.js:1044:20)
at Server.setupListenHandle [as _listen2] (net.js:1334:19)
at listenInCluster (net.js:1392:12)
at doListen (net.js:1501:7)
at _combinedTickCallback (internal/process/next_tick.js:141:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
at Function.Module.runMain (module.js:686:11)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3
You should be able to view the page on your server using its IP. But you may need to take a couple of steps first:
Take note of which port your Node app is listening on. 3000? 80? In production (i.e. on your cloud server instance), it would be customary to run your application on the default HTTP port, which is 80. But other ports are fine to use too.
Depending on your cloud provider, you may have to adjust its Network Settings before it allows any inbound traffic from the internet through to your server. On AWS, for example, each instance is bound to a Security Group. Think of this as a cloud-level firewall that controls internet access to and from your server. On AWS, again as an example, you'd have to adjust your Security Group Inbound Rules to allow TCP connections to be established to port 80 (or whichever port your Node app is listening on). Here's a sample picture of what it looks like. In this example, I've opened port 80 of my server for TCP traffic. Open whichever port that your Node app is listening on. The protocol for HTTP is TCP.
Furthermore, you may have to also adjust your server's internal firewall settings. On Ubuntu, in order to check the status of the firewall, issue this command:
$ sudo ufw status
If the status is inactive, then it means Ubuntu is not enforcing any firewall rules. If it's active, however, you need to make sure that it is allowing incoming traffic to your Node app's port. I'll let you research how to adjust ufw settings.
Finally, obtain the Public facing IP address or assigned domain name of your server. On AWS, this information is available on your instance details view:
So, now you should be able to browse, from anywhere on the internet to your server's public IP and your Node app's port and view the page.
http://ip:port
If your server's IP is 123.123.123.123 and your Node app is listening on port 3000, then the address would be http://123.123.123.123:3000. If your Node app is listening on port 80, then there's no need to specify the port when you browse. So you can simply go to: http://123.123.123.123
I received the answer from tech support at DreamHost.com. I quote: "The problem is that in order to bind to any port lower than 1000, you need to use sudo."
I am using port 80, so the following works:
sudo node index01
Update: The exact limit is 1024, i.e., when a port lower than 1024 is used sudo must precede the node command.

Portforward from x to 53

I'm trying to run a dns server using dnsmasq which by default binds to port 53 and so requires sudo. I'm wondering if I can just run it on any unreserved port (9999) and setup a rule to forward traffic from port 53 to 9999? I'm guessing it might not work seeing as by default 53 is not open, so I would likely need something listening on port 53 that would forward the traffic to port 9999?
Configuring dnsmasq to listen on port 9999 is done by adding line port=9999 to /etc/dnsmasq.conf and restarting the service service dnsmasq restart.
As per your other question about having another something listening on port 53 only to forward to port 9999, well you can certainly write a daemon to do that, and binding it to port 53 will require that you have privilege to bind to port 53 in the first place, so in your case I don't know if that's possible. Then again, if you could do that obviously you'd bind dnsmasq to port 53 in the first place...
So if your dnsmasq is listening on port 9999, you need to point your traffic to that port, wherever that traffic is coming from.

I currently run my amazon ec2 instance on port 3000. I want to run it on port 80 instead. How can I do it?

I have a node.js app that runs on port 3000. I deployed it on amazon web services (ec2) and it works over there. My server.js file says:
var port = process.env.PORT || 3000;
(...)
app.listen(port);
console.log('App listening on port ' + port);
My security group in aws settings seems to have the port 80 also opened:
so I thought it's enough to just change the var port to = 80 and restart the server. But when I did that I got an error:
bitnami#ip-172-31-47-102:~/apps/myproject/www/myproject$ sudo node server.js
App listening on port 80
events.js:141
throw er; // Unhandled 'error' event
^
Error: listen EADDRINUSE :::80
at Object.exports._errnoException (util.js:856:11)
at exports._exceptionWithHostPort (util.js:879:20)
at Server._listen2 (net.js:1237:14)
at listen (net.js:1273:10)
at Server.listen (net.js:1369:5)
at Function.app.listen (/opt/bitnami/apps/myproject/www/myproject/node_modules/express/lib/application.js:542:24)
at Object.<anonymous> (/opt/bitnami/apps/myproject/www/myproject/server.js:43:5)
at Module._compile (module.js:398:26)
at Object.Module._extensions..js (module.js:405:10)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Function.Module.runMain (module.js:430:10)
at startup (node.js:141:18)
at node.js:1003:3
I'm using the Bitnami MEAN 3.2.1-0 system on Amazon.
Also, the reason why I want to change this port is this:
so far all my webservices operate on port 3000. However, I also have there a public_html folder with the index.html file. So when any user wants to display my webpage he has to enter not only the webpage, but also the port (3000) which is not that convenient.
So far the whole app stays under www.ec2-some-random-amazom-numbers.eu-west-1.compute.amazonaws.com:3000/index.html so I will buy a normal top level domain to point at it (eg. something.com ) but then - do I still need to change the port 3000 to 80 in that case? Or maybe it's common to leave apps on port other than 80?
If the latter, then will it be possible for me to leave the port as it is and just point the top level domain on this whole long amazon one with a port 3000 at the end?
So for example: when user types www.something.com it will redirect him to
www.ec2-some-random-amazom-numbers.eu-west-1.compute.amazonaws.com:3000/index.html ?
Something like this should work for you:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
You want to use iptables to forward request coming in on port 80 to port 3000 internally.
Based on the error you're getting, (EADDRINUSE), some other web server is listening on port 80 already on your server. If you can prevent that server from running, then you can change your app to run on port 80.
Do the following:
Figure out what's already running on port 80 on your server. There's a good chance it's Apache. Try using netstat to verify.
Kill it (and prevent it from restarting). This will depend on whats listening.
Move your app to port 80 just like you've already tried.
Additional resources:
http://www.cyberciti.biz/faq/what-process-has-open-linux-port/
If you are using the Bitnami Mean Stack then Apache is listening in port 80, hence the conflict. You can either stop the bundled Apache:
sudo /opt/bitnami/ctlscript.sh stop apache
Or you could add a ProxyPass rule in the Apache configuration:
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass
I use nginx proxy server for port forwarding
I have faced the same issue.
The solution is to start your NodeJs or ExpressJs app using Port 80, I mean
var port = 80 and start the app using sudo node bin/www
My issue is not able to access the app from internet when the app is running on port 3000: NodeJs App in AWS using port 3000 is not accessible from Internet

trying to run AolServer on port 80/443 on linux Centos 6

In open source project,project open, I'm trying to run the server on port 80 for http and 443 for https which gave an error
[-nssock:driver-] Error: nssock: failed to listen on 0.0.0.0:80: Permission denied
and also is there anything else required to enable https port(like certification,etc)
Are there any other applications which already used the port 80? run below command to find out what applicaiton use the resource
netstat -an |grep "\.80 "
lsof -i:80
Probably you are trying to run AolServer as non-root user, but AolServer is configured to use "privileged" ports 80 and 443 (ports below 1024 are "privileged").
You may either configure your system to allow non-root process to bind to "privileged" ports, or just run AolServer as root. For the first approach also check discussion of the capabilities system.

Resources