Błąd EACCES Node.js podczas nasłuchiwania na większości portów

250

Testuję aplikację (mam nadzieję, że uruchomię ją na Heroku, ale mam również problemy lokalnie). Daje mi błąd EACCES, gdy działa http.Server.listen () - ale występuje tylko na niektórych portach.

Więc lokalnie działam:

joe@joebuntu:~$ node
> var h = require('http').createServer();
> h.listen(900);
Error: EACCES, Permission denied
    at Server._doListen (net.js:1062:5)
    at net.js:1033:14
    at Object.lookup (dns.js:132:45)
    at Server.listen (net.js:1027:20)
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:150:22)
    at Interface.emit (events.js:42:17)
    at Interface._onLine (readline.js:132:10)
    at Interface._line (readline.js:387:8)
    at Interface._ttyWrite (readline.js:564:14)

Nie mam nic uruchomionego na porcie 900 (lub innym 20 innych portów, których próbowałem), więc to powinno działać. Dziwne jest to, że to nie działa na niektórych portach. Na przykład port 3000 działa idealnie.

Co by to spowodowało?

Aktualizacja 1:

Zrozumiałem, że na moim komputerze lokalnym pojawia się błąd EACCES, ponieważ muszę uruchomić węzeł jako root, aby połączyć się z tymi niektórymi portami. Nie wiem, dlaczego tak się dzieje, ale użycie sudo naprawia to. Nie wyjaśnia to jednak, jak naprawiłbym to na Heroku. Nie ma sposobu, aby uruchomić się jako root na Heroku, więc jak mogę słuchać na porcie 80?

jwegner
źródło
23
Porty mniejsze niż 1024 tradycyjnie wymagają podwyższonych uprawnień. W Heroku nie słuchasz portu 80, słuchasz portu, o którym mówią, za pomocą zmiennych środowiskowych, i pozwalasz, aby ich warstwa routingu obsługiwała wiązanie portu 80 na krawędzi.
Mâtt Frëëman,
Twoja aktualizacja 1 pomogła mi. „sudo node myporgram.js” uruchomił go.
Saber

Odpowiedzi:

352

Uruchamianie na stacji roboczej

Zasadniczo procesy działające bez uprawnień administratora nie mogą łączyć się z portami poniżej 1024.

Wypróbuj wyższy port lub uruchom z podwyższonymi uprawnieniami przez sudo. Możesz obniżyć uprawnienia po połączeniu z niskim portem za pomocą process.setgidi process.setuid.

Działa na heroku

Podczas uruchamiania aplikacji na heroku musisz użyć portu określonego w zmiennej środowiskowej PORT.

Zobacz http://devcenter.heroku.com/articles/node-js

const server = require('http').createServer();
const port = process.env.PORT || 3000;

server.listen(port, () => console.log(`Listening on ${port}`));
Ben Taber
źródło
3
Czy to oznacza, że ​​muszę użyć portu dostarczonego przez Heroku, a potem zrobią trochę magii za kulisami, aby przenieść to na port 80? Co jeśli chcę uruchomić coś nie na porcie 80?
jwegner
12
Tak. Możesz nasłuchiwać tylko portu, który powiemy na $ PORT. Dbamy o routing 80 lub 443 do twojego portu. Rzeczywisty port zmienia się przez cały czas, gdy poruszamy twoją dyno. W tej chwili obsługujemy tylko routing publiczny z lat 80 i 443.
Będzie
@Czy jest jakaś szansa na zniesienie tego ograniczenia? W szczególności, czy można nasłuchiwać na portach innych niż 80 lub 443? To dość restrykcyjny zestaw, biorąc pod uwagę wszystko.
ghayes
2
Dlaczego chcesz, aby Twoja aplikacja działała na innym porcie niż http i https?
Czy
1
@Will Chciałbym hostować prosty serwer gier na Heroku. Unity musi przesyłać dane crossdomain.xmlprzez port 843.
polkovnikov.ph
178

Użytkownik nieuprzywilejowany (nie root) nie może otworzyć gniazda nasłuchującego na portach poniżej 1024.

użytkownik1303768
źródło
5
Upvoted - jest to dobra ogólna zasada, ale są wyjątki, np. „Możliwości” w Linuksie.
mikemaccana
3
Właśnie zaoszczędziłeś mi godzin debugowania. Nie wiedziałem o tym.
Malharhak
6
Nie podoba mi się to, ale nie chcę tego robić sudopodczas uruchamiania serwera ekspresowego za pomocą węzła (faktycznie gulp). To nie ma sensu
blamb
ten kawałek mądrości
mauris
4
@blamb Następnie skorzystaj z rozwiązania MeetMehta ; ^)
ruffin
108

Sprawdź ten link referencyjny :

Zezwól bezpiecznemu użytkownikowi na korzystanie z portu 80

Pamiętaj, że NIE chcemy uruchamiać twoich aplikacji jako użytkownik root, ale jest pewien problem: twój bezpieczny użytkownik nie ma uprawnień do korzystania z domyślnego portu HTTP (80). Twoim celem jest opublikowanie witryny internetowej, z której użytkownicy mogą korzystać, przechodząc do łatwego w użyciu adresu URL, takiego jak http://ip:port/

Niestety, chyba że zalogujesz się jako root, zwykle będziesz musiał użyć adresu URL typu http://ip:port- gdzie numer portu> 1024.

Utknęło tu wiele osób, ale rozwiązanie jest łatwe. Jest kilka opcji, ale to mi się podoba. Wpisz następujące polecenia:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

Teraz, gdy powiesz aplikacji Node, że chcesz, aby działała na porcie 80, nie będzie narzekać.

Poznaj Mehta
źródło
5
To zdecydowanie najlepsze rozwiązanie.
Mark Lagendijk
1
@MarkLagendijk: Thanks Mark. Ja też to samo pytanie przez pomyłkę i napisali szczegółową odpowiedź tutaj stackoverflow.com/questions/23281895/... . Możesz go również edytować.
Spotkaj się Mehta
6
dlaczego nie jest to odpowiedź 👍
KhaledMohamedP
@KhaledMohamedP: Cieszę się, że pomogło :)
Spotkaj się z Mehta
Kto powiedział, że to nadal nie działa z modułem pm2. Zabij swój PM2, używając go pm2 killi ponownie utwórz.
Prasanth Jaya
10

Innym podejściem jest przekierowanie portu:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 900 -j REDIRECT --to-port 3000

I uruchom serwer na porcie> 1024:

require('http').createServer().listen(3000);

ps przy okazji, to samo można zrobić dla portu https (443).

jedenaście
źródło
1
Dziękuję dziękuję! Pozwoliło mi to zaoszczędzić godzinę debugowania bezpiecznych portów, kolejną godzinę przekierowania SSL, a także pozwoliło mi ograniczyć widoczność serwera programistycznego na AWS Lightstail (co nie pozwala na dostrajanie żądań według adresu IP).
miguelmorin
3

Oznacza to, że węzeł nie może nasłuchiwać na określonym porcie. Zmień go na coś w rodzaju 1234 lub 2000 lub 3000 i zrestartuj serwer.

Mark Karwowski
źródło
3

O MÓJ BOŻE!! W moim przypadku robiłem ....listen(ip, port)zamiast tego ...listen(port, ip)i to powodowało błąd msg:Error: listen EACCES localhost

Używałem numerów portów> = 3000, a nawet próbowałem z dostępem administratora. Nic nie wyszło. Potem przy bliższym odświeżeniu zauważyłem problem. Zmieniłem to na...listen(port, ip) i wszystko zaczęło działać dobrze !!

Wywoływanie tego na wypadek, gdyby było przydatne dla kogoś innego ...

Dilip Muthukurussimana
źródło
Dziękuję Ci! Miałem ten sam problem. Jestem przyzwyczajony do wszystkich innych interfejsów API używających nazwy hosta, portu.
David
Miałem ten problem, gdy próbowałem uruchomić obraz dokera Wekan. Rozwiązałem za pomocą tej wskazówki. Dziękuję Ci.
Ângelo Polotto
@ dilip-muthukurussimana Czy zamierzasz mieć ....listen(ip, port)w swojej odpowiedzi (z czterema .)? Minęła minuta, zanim zdałem sobie sprawę, że przez to mówisz o kolejności argumentów.
bschlueter
Tak, miałem na myśli tylko kolejność argumentów. Pls nie umieszczaj tam ....(czterech kropek), co moim zdaniem było oczywiste.
Dilip Muthukurussimana
2

Wystąpił ten błąd na moim komputerze Mac, ponieważ domyślnie działał on na serwerze Apache przy użyciu tego samego portu, który jest używany przez serwer węzła, którym w moim przypadku był port 80. Wszystko, co musiałem zrobić, to zatrzymać go za pomocą sudo apachectl stop

Mam nadzieję, że to komuś pomoże.

mabounassif
źródło
2

Mam również ten błąd na komputerze Mac. Używam npm run devdo uruchamiania mojej aplikacji Nodejs w systemie Windows i działa dobrze. Ale dostałem ten błąd na moim komputerze Mac - error given was: Error: bind EACCES null:80.

Jednym ze sposobów rozwiązania tego problemu jest uruchomienie go z dostępem do konta root. Możesz użyć sudo npm run devi będziesz musiał podać hasło.

Zasadniczo lepiej jest obsługiwać aplikację na nieuprzywilejowanym porcie, takim jak 3000, który będzie działał bez uprawnień roota.

odwołanie: błąd EACCES Node.js podczas nasłuchiwania na porcie http 80 (odmowa dostępu)

ZILONG PAN
źródło
2

Miałem podobny problem, że odmawiał uruchomienia na porcie 8080, ale także dowolny innym.

Okazuje się, że to dlatego env.local, że odczytany plik zawierał komentarze po nazwach zmiennych, takich jak:

PORT=8080 # The port the server runs at

I tak to interpretował, próbując użyć portu „ 8080 # The port the server runs at”, który jest oczywiście nieprawidłowym portem (-1). Usunięcie komentarzy całkowicie go rozwiązało.

Nawiasem mówiąc, używając Windows 10 i Git Bash.


Wiem, że nie jest to dokładnie opisany tutaj problem, ale może komuś pomóc. Wylądowałem na tym pytaniu, szukając problemu dla mojej odpowiedzi, więc ... może?

Fusseldieb
źródło
Tak, doświadczyłem tego. Może to powodować komentarze po wartościach w plikach .env.
Danoz
1

Pamiętaj, że jeśli używasz sudo do łączenia się z portem 80 i używasz zmiennych env PORT & NODE_ENV, musisz ponownie wyeksportować te zmienne, ponieważ jesteś teraz w profilu root, a nie w profilu użytkownika. Aby to działało na moim komputerze Mac, wykonałem następujące czynności:

sudo su
export NODE_ENV=production
export PORT=80
docpad run
Sean
źródło
1

dzieje się tak, jeśli port, na którym próbujesz hostować lokalnie, jest włączony do portfela

Jasper Smith
źródło
1

Spróbuj authbind:

http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html

Po instalacji możesz dodać plik z nazwą numeru portu, którego chcesz użyć w następującym folderze: / etc / authbind / byport /

Nadaj mu 500 uprawnień za pomocą chmod i zmień właściciela na użytkownika, na którym chcesz uruchomić program.

Następnie wykonaj „authbind node ...” jako ten użytkownik w swoim projekcie.

DraughtGlobe
źródło
1

Mój błąd został rozwiązany przez zmianę numeru portu w server.js Specjalnie w tym wierszu

const port = process.env.PORT || 8085;

Zmieniłem numer portu na 8085 z 8080.

Mam nadzieję, że to pomoże.

Alok Ranjan
źródło
0

Po wypróbowaniu wielu różnych sposobów ponowne zainstalowanie IIS w moich oknach rozwiązało problem.

Klatka
źródło
0

Mój błąd został rozwiązany za pomocą (w systemie Windows)

app.set('PORT', 4000 || process.env.PORT);

app.listen(app.get('PORT'), <IP4 address> , () => {
    console.log("Server is running at " + app.get('PORT'));
});

Zezwól aplikacji NodeJS na dostęp do sieci w Zaporze systemu Windows.

Prathamesh More
źródło
0

restart nie był wystarczający! Jedynym sposobem rozwiązania tego problemu jest:

Musisz zabić usługę działającą w tym porcie.

w cmd, uruchom jako admin, a następnie wpisz: netstat -aon | znajdź / i „słucham”

otrzymasz listę z aktywną usługą, wyszukaj port działający na 4200 i użyj identyfikatora procesu, który jest ostatnią kolumną, aby go zabić

: taskkill / F / PID 2652

Krebto
źródło