Uruchamiam instancję Debiana na Amazon EC2 z zainstalowanym Node.js. 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");
Otrzymuję dane wyjściowe poniżej, które mówią mi, że inny proces nasłuchuje 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, gdy sprawdzam, czy istnieje proces (jako root, jeśli coś jest ukryte) nasłuchujący na porcie 80 przy użyciu:
netstat -tupln
Otrzymuję poniższe wyjście, które mówi mi, że nic nie nasłuchuje 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 na porcie 80? Dlaczego jest blokowany w Debianie? Jakie kroki należy podjąć, aby kod działał poprawnie?
źródło
Zamiast pracować na porcie 80, możesz przekierować port 80 do portu aplikacji (> 1024) za pomocą
To zadziała, jeśli Twoja aplikacja działa na porcie 3000.
źródło
sudo
jeszcze więcej.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ź
Edytować:
Może nie działać w nowych wersjach węzłów
źródło
Zwróć uwagę, że jeśli masz
apache
uruchomione, możesz utworzyć odwrotne proxy na serwerze vhost. Jeśli twój węzeł działa na porcie8080
:Oczywiście dodaj serwer do
/etc/hosts
:Będziesz musiał włączyć odpowiednie moduły Apache:
... a teraz możesz się połączyć
http://myLocalServer
.źródło
Dla tych, którzy szukają szybkiego i łatwego rozwiązania dla środowiska programistycznego , przekazywanie portów przez ssh może być dobrą alternatywą:
To przekazuje port 80 na hoście lokalnym do portu 3000 na hoście lokalnym.
Musi być uruchomiony jako root (uprzywilejowany port). Aby anulować, po prostu naciśnij ctrl-c w terminalu. (Możesz dodać
-f
flagę, aby polecenie działało w tle, ale wtedy musisz ją znaleźć ponownie, aby ją zabić).To rozwiązanie wymaga lokalnego serwera ssh . Można to zrobić szybko , ale pamiętaj o konsekwencjach dla bezpieczeństwa w przypadku korzystania z sieci współdzielonej. Możesz chcieć zastosować przynajmniej pewien poziom dodatkowego bezpieczeństwa (wyłącz hasło i login root).
Osobiście używam tego tylko na moim komputerze lokalnym. 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 upewnić się, że to polecenie działa przez cały czas, co powoduje więcej bólów głowy. W przypadku środowisk produkcyjnych sugeruję użycie odwrotnego serwera proxy, takiego jak nginx .
źródło
odpowiedź heksacyjanku jest prawidłowa. ale czy jest jakieś rozwiązanie, które sprawi, że to zadziała?
odpowiedź brzmi tak.
w jaki sposób?
możesz użyć
reverse proxy
na przykład uruchomićnginx reverse proxy
na porcie80
i przekazać proxy do miejsca docelowego, wip:port
którym węzeł go używa.możesz to ustawić, używając
docker container
tego, co jeszcze bardziej ułatwia życie. to jest oficjalna kompilacja nginx w docker hub, którą możesz pobrać.jest jeszcze więcej korzyści z używania,
reverse proxy
że możesz go wygooglować.źródło
Mam ten sam błąd i próbowałem uruchomić moją aplikację za pomocą sudo i zadziałało.
bez sudo
iz sudo
źródło
Korzystanie z PORT 80 wymaga pewnych specjalnych uprawnień. Użycie
sudo
przed uruchomieniem instrukcji aplikacji rozwiązało mój problem. na przykład, jeśli używasz npm do uruchamiania aplikacji, możesz wpisaćsudo npm start
źródło
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 uprawnień administratora.Uruchom program z
sudo
uprawnieniami. Uruchomsudo su
polecenie przed uruchomieniem programu.źródło