Węzeł.aplikacja js nie może działać na porcie 80, nawet jeśli nie ma innego procesu blokującego port

Uruchamiam instancję Debiana na Amazon EC2 z Node.js zainstalowany. Jeśli uruchomię poniższy kod:

http = require('http');

http.createServer(function (request, response){
  response.writeHead(200, {'Content-Type':'text/plain'});
  response.end('Hello World\n');
}).listen(80);
console.log("Running server at port 80");

Dostaję wyjście poniżej, które mówi mi, że jest inny proces nasłuchujący na porcie 80:

Running server at port 80

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: listen EACCES
    at errnoException (net.js:901:11)
    at Server._listen2 (net.js:1020:19)
    at listen (net.js:1061:10)
    at Server.listen (net.js:1127:5)
    at Object.<anonymous> (/home/admin/nodetests/nodetest.js:6:4)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

Teraz kiedy sprawdzam czy jest jakiś proces (jako root w razie gdyby coś było ukryte) nasłuchujący na porcie 80 używając:

netstat -tupln

Dostaję poniższe wyjście, które mówi mi, że nie ma nic nasłuchującego na porcie 80:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1667/sshd       
tcp6       0      0 :::22                   :::*                    LISTEN      1667/sshd

Powinienem zauważyć, że debian ma otwarty port 80 jako regułę przychodzącą, jeśli to robi różnicę.

Moje pytanie brzmi: co robię źle? Dlaczego nie mogę zidentyfikować procesu nasłuchującego Portu 80? Dlaczego jest on blokowany w Debianie? Jakie kroki należy podjąć, aby Kod działał poprawnie?
Author: hexacyanide, 2013-09-22

8 answers

Kod błędu EACCES oznacza, że nie masz odpowiednich uprawnień do uruchamiania aplikacji na tym porcie. W systemach Linux każdy port poniżej 1024 wymaga dostępu roota.

 199
Author: hexacyanide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-22 18:53:48

Zamiast działać na porcie 80 Możesz przekierować port 80 do portu aplikacji (>1024) używając

iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000

Zadziała, jeśli aplikacja jest uruchomiona na porcie 3000.

 73
Author: Kamrul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-22 22:48:00

Krótka odpowiedź: możesz zezwolić węzłowi na dostęp do tego portu za pomocą:

setcap 'cap_net_bind_service=+ep' /path/to/nodejs

Długa ODPOWIEDŹ

Edit:

Może nie działać na nowych wersjach węzłów

 20
Author: Reut Sharabani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-08 19:42:44

Zauważ, że jeśli masz uruchomiony apache, możesz utworzyć odwrotne proxy na vhost. Jeśli Twój węzeł działa na porcie 8080:

<VirtualHost 127.0.0.1:80>
        ServerName myLocalServer

        ProxyPass        /  http://localhost:8080/
        ProxyPassReverse /  http://localhost:8080/
</VirtualHost>

Oczywiście Dodaj serwer do /etc/hosts:

127.0.0.1    myLocalServer

Będziesz musiał włączyć odpowiednie moduły apache:

sudo a2enmod proxy_html
sudo a2enmod proxy_http
sudo a2enmod proxy_connect
sudo a2enmod proxy_ajp
sudo service apache2 restart

...teraz możesz połączyć się z http://myLocalServer.

 6
Author: Redsandro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-12 19:50:24

Dla tych, którzy szukają szybkiego i łatwego rozwiązania dla środowiska programistycznego , przekierowanie portów przez ssh może być miłą alternatywą:

ssh -L 80:localhost:3000 yourusername@localhost -N

Ten przekazuje port 80 na localhost do portu 3000 na localhost.

Musi być uruchomiony jako root (uprzywilejowany port). Aby go anulować, po prostu naciśnij ctrl-c w terminalu. (Możesz dodać flagę -f, aby Komenda była uruchamiana w tle, ale musisz ją znaleźć ponownie, aby ją zabić).

To rozwiązanie wymaga musisz mieć serwer SSH działający lokalnie. można to zrobić szybko , ale pamiętaj o implikacjach bezpieczeństwa, jeśli korzystasz ze współdzielonej sieci. Możesz zastosować co najmniej pewien poziom dodatkowego bezpieczeństwa(wyłącz hasło i logowanie root).

Ja osobiście używam tego tylko na mojej lokalnej maszynie. Nie jestem pewien, jak to wpływa na szybkość przetwarzania twoich żądań, jeśli uruchomisz to na produkcji, może ktoś ma pomysł. W każdym razie, musisz się upewnić to polecenie działa cały czas, co wprowadza więcej bólów głowy. Dla środowisk produkcyjnych , proponuję użyć odwrotnego serwera proxy, takiego jak nginx .
 3
Author: panepeter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-27 09:08:43

Odpowiedź heksacyjanku jest prawidłowa. ale czy jest jakieś rozwiązanie, aby to zadziałało?

Odpowiedź brzmi: tak.

Jak?

Możesz użyć reverse proxy Na przykład uruchomić nginx reverse proxy na porcie 80 i przekazać proxy do miejsca docelowego ip:port, który go używa.

Możesz to skonfigurować za pomocą docker container, co sprawia, że życie jest jeszcze łatwiejsze. to jest oficjalna kompilacja nginx w docker hub, który możesz pobrać.

Jest jeszcze więcej korzyści z używania reverse proxy, że możesz go wygooglować.

 2
Author: Ali_Hr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-06 06:40:45

Mam ten sam błąd i próbowałem uruchomić moją aplikację przy użyciu sudo i to działało dla mnie.

Bez sudo

mansi@mansi:~/NodePractice$ node myFirst.js 
events.js:141
      throw er; // Unhandled 'error' event
      ^

Error: listen EACCES 0.0.0.0:80
    at Object.exports._errnoException (util.js:870:11)
    at exports._exceptionWithHostPort (util.js:893:20)
    at Server._listen2 (net.js:1224:19)
    at listen (net.js:1273:10)
    at Server.listen (net.js:1369:5)
    at Object.<anonymous> (/home/mansi/NodePractice/myFirst.js:6:4)
    at Module._compile (module.js:410:26)
    at Object.Module._extensions..js (module.js:417:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)

I z sudo

mansi@mansi:~/NodePractice$ sudo node myFirst.js 
^C
 0
Author: Parth Pachchigar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-14 00:15:46

Kod błędu EACCES oznacza, że nie masz odpowiednich uprawnień do uruchamiania aplikacji na tym porcie. W systemach Linux każdy port poniżej 1024 wymaga dostępu roota.

Uruchom program z sudo permission. Uruchom polecenie sudo su Przed uruchomieniem programu.

 -2
Author: akshith ranjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-24 13:41:22