대부분의 포트에서 청취 할 때 Node.js EACCES 오류


250

앱을 테스트하고 있습니다 (허 로쿠에서 실행하기를 원하지만 로컬에서도 문제가 있습니다). http.Server.listen ()을 실행할 때 EACCES 오류가 발생하지만 일부 포트에서만 발생합니다.

그래서 로컬에서 실행 중입니다.

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)

포트 900 (또는 내가 시도한 다른 20 포트 중 하나)에서 실행중인 항목이 없으므로 작동합니다. 이상한 부분은이다 않는 일부 포트 작업을. 예를 들어 포트 3000은 완벽하게 작동합니다.

이 원인은 무엇입니까?

업데이트 1 :

로컬 컴퓨터에서 특정 포트에 바인딩하기 위해 노드를 루트로 실행해야하기 때문에 EACCES 오류가 발생한다는 것을 알았습니다. 왜 이런 일이 발생하는지 모르겠지만 sudo를 사용하면 문제가 해결됩니다. 그러나 이것은 Heroku에서 어떻게 고칠 지 설명하지 않습니다. Heroku에서 루트로 실행할 방법이 없으므로 포트 80에서 어떻게들을 수 있습니까?


23
1024 미만의 포트는 전통적으로 높은 권한을 요구합니다. Heroku에서는 포트 80을 수신하지 않고 환경 변수를 통해 사용자에게 알려주는 포트를 수신하고 라우팅 계층이 에지에서 포트 80 바인딩을 처리하도록합니다.
Mâtt Frëëman

업데이트 1이 도움이되었습니다. 'sudo node myporgram.js'가 실행되었습니다.
Saber

답변:


352

워크 스테이션에서 실행

일반적으로 루트 권한없이 실행되는 프로세스는 1024 미만의 포트에 바인딩 할 수 없습니다.

따라서 더 높은 포트를 사용하거나을 통해 높은 권한으로 실행하십시오 sudo. 낮은 포트에 바인딩 한 후 권한을 다운 그레이드 할 수 있습니다.process.setgidprocess.setuid.

heroku에서 실행

heroku에서 앱을 실행할 때는 PORT 환경 변수에 지정된대로 포트를 사용해야합니다.

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}`));

3
이것은 Heroku가 제공 한 포트를 사용해야한다는 것을 의미하며, 포트 80으로 전송하기 위해 무대 뒤에서 마술을 할 것입니까? 포트 80이 아닌 것을 실행하려면 어떻게해야합니까?
jwegner

12
예. $ PORT로 알려주는 포트만들을 수 있습니다. 80 또는 443을 포트로 라우팅합니다. 우리가 당신의 dyno를 움직일 때 실제 포트는 항상 변경됩니다. 현재로서는 80 및 443에서 공개적으로 라우팅하는 기능 만 지원합니다.
Will

@ 제한이 해제 될 가능성이 있습니까? 특히, 80 또는 443 이외의 포트에서 청취 할 수 있습니까? 그것은 모든 것을 고려하여 꽤 제한적인 세트입니다.
ghayes

2
왜 앱이 http 및 https가 아닌 다른 포트에서 실행되기를 원합니까?
Will

1
@ Heroku에서 간단한 게임 서버를 호스팅하고 싶습니다. 유니티는 crossdomain.xml843 포트를 통해 전송해야합니다 .
polkovnikov.ph

178

권한이없는 사용자 (루트 아님)는 1024 미만의 포트에서 청취 소켓을 열 수 없습니다.


5
공감-이것은 일반적인 규칙이지만 Linux의 '기능'과 같은 예외가 있습니다.
mikemaccana

3
방금 디버그 시간을 절약했습니다. 나는 그것에 대해 몰랐다.
Malharhak

6
나는 이것을 좋아하지 않지만, sudo노드 (실제로 gulp)를 사용하여 Express 서버를 실행할 때 필요하지 않습니다 . 이해가되지 않습니다
blamb

이 지혜의 조각
mauris

4
@blamb 그런 다음 MeetMehta의 솔루션을 사용 하십시오 ; ^)
ruffin

108

참조 링크를 확인하십시오 .

안전한 사용자에게 포트 80 사용 권한 부여

우리는 응용 프로그램을 루트 사용자로 실행하고 싶지 않지만 장애가 있습니다. 안전한 사용자에게는 기본 HTTP 포트 (80)를 사용할 권한이 없습니다. 목표는 방문자가 사용하기 쉬운 URL로 이동하여 방문자가 사용할 수있는 웹 사이트를 게시하는 것입니다 http://ip:port/

불행히도 루트로 로그인하지 않으면 일반적으로 http://ip:port포트 번호> 1024 와 같은 URL을 사용해야합니다 .

많은 사람들이 여기에 붙어 있지만 해결책은 쉽습니다. 몇 가지 옵션이 있지만 이것이 내가 좋아하는 옵션입니다. 다음 명령을 입력하십시오.

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

이제 노드 응용 프로그램에 포트 80에서 실행하라고 지시하면 불평하지 않습니다.


5
이것은 확실히 최고의 솔루션입니다.
Mark Lagendijk

1
@ MarkLagendijk : 감사합니다. 나는 또한 같은 질문을 잘못하고 여기에 stackoverflow.com/questions/23281895/… 에 대한 자세한 답변을 게시했습니다 . 자유롭게 편집하십시오.
Mehta 만나기

6
왜 이것이 답이 아닌가?
KhaledMohamedP

@KhaledMohamedP는 : 다행이 :) 도움이
만나 메타에게

누가 여전히 pm2 모듈에서 작동하지 않는다고 말합니다. 사용하여 pm2를 종료 pm2 kill하고 다시 만드십시오.
Prasanth Jaya

10

다른 방법은 포트 리디렉션을 만드는 것입니다.

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

그리고> 1024 포트에서 서버를 실행하십시오.

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

추신 https (443) 포트에 대해서도 동일하게 수행 할 수 있습니다.


1
감사합니다 감사합니다 이를 통해 안전한 포트에 대한 1 시간의 디버깅, SSL 리디렉션에 대한 1 시간의 시간을 절약하고 AWS Lightstail에서 개발 서버의 가시성을 제한 할 수있었습니다 (IP 주소별로 요청을 미세 조정할 수 없음).
miguelmorin

3

노드가 정의 된 포트에서 청취 할 수 없음을 의미합니다. 1234 또는 2000 또는 3000과 같은 것으로 변경하고 서버를 다시 시작하십시오.


3

세상에! 제 경우에는 ....listen(ip, port)대신에 하고있었습니다...listen(port, ip) 하고 있었고 오류 msg가 발생했습니다.Error: listen EACCES localhost

포트 번호> = 3000을 사용하고 있었고 관리자 액세스로 시도했습니다. 아무것도 해결되지 않았습니다. 그런 다음 자세히 살펴보면서 문제를 발견했습니다. 로 변경...listen(port, ip) 하고 모든 것이 잘 작동하기 시작했습니다!

다른 사람에게 유용 할 경우를 대비하여 전화하십시오.


감사합니다! 나는 같은 문제가 있었다. 호스트 이름, 포트를 사용하는 다른 모든 API에 익숙합니다.
David

Wekan docker 이미지를 실행하려고 할 때이 문제가 발생했습니다. 이 팁을 사용하여 해결했습니다. 감사합니다.
Ângelo Polotto

@ dilip-muthukurussimana ....listen(ip, port)답을 원 .하십니까? 그로 인해 논쟁의 순서에 대해 이야기하고 있다는 것을 깨닫는 데 잠시 시간이 걸렸습니다.
bschlueter

예, 나는 논쟁의 순서만을 의미했습니다. Pls는 ....거기 에 (4 개의 점)을 넣지 않았습니다 .
Dilip Muthukurussimana

2

노드 서버에서 사용하는 것과 동일한 포트를 사용하여 기본적으로 아파치 서버를 실행했기 때문에 내 Mac 에서이 오류가 발생했습니다. 내 경우에는 포트 80이었습니다. sudo apachectl stop

이것이 누군가를 돕기를 바랍니다.


2

내 Mac 에서도이 오류가 발생했습니다. npm run devWindows에서 Nodejs 앱을 실행 하는 데 사용 하며 정상적으로 작동합니다. 그러나 Mac에서이 오류가 발생했습니다 error given was: Error: bind EACCES null:80.

이를 해결하는 한 가지 방법은 루트 액세스 권한으로 실행하는 것입니다. 귀하는 sudo npm run dev귀하의 비밀번호를 사용 하고 필요할 수 있습니다.

일반적으로 루트 권한없이 작동하는 3000과 같은 권한이없는 포트에서 응용 프로그램을 제공하는 것이 좋습니다.

참조 : http 80 포트에서 청취 할 때 Node.js EACCES 오류 (권한 거부)


2

나는 포트 8080에서 실행 거부뿐만 아니라되었다는 비슷한 문제가 있었다 어떤 다른.

env.local읽은 파일에 변수 이름 뒤에 주석이 포함되어 있기 때문입니다 .

PORT=8080 # The port the server runs at

그리고 그것은 포트 " 8080 # The port the server runs at" 를 사용하려고했던 것처럼 그것을 해석했습니다 . 이것은 분명히 유효하지 않은 포트 (-1)입니다. 주석을 완전히 제거하면 해결되었습니다.

그건 그렇고 Windows 10과 Git Bash를 사용합니다.


나는 그것이 아니에요 알고 정확히 문제가 여기에 설명하지만,이 사람을 도움이 될 수 있습니다. 나는이 질문에 내 대답에 대한 문제를 찾고 있었으므로 아마도 ...


그래, 나는 이것을 경험했다. .env 파일의 값 뒤에 주석이 있으면이 문제가 발생할 수 있습니다.
Danoz

1

sudo를 사용하여 포트 80에 바인드하고 env 변수 PORT & NODE_ENV를 사용하는 경우 사용자 프로파일이 아닌 루트 프로파일 아래에 있으므로 해당 변수를 다시 내 보내야합니다. 그래서 이것을 내 Mac에서 작동 시키려면 다음을 수행하십시오.

sudo su
export NODE_ENV=production
export PORT=80
docpad run


1

authbind를 시도하십시오.

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

설치 후 다음 폴더에 사용하려는 포트 번호의 이름으로 파일을 추가 할 수 있습니다. / etc / authbind / byport /

chmod를 사용하여 500 개의 권한을 부여하고 프로그램을 실행하려는 사용자의 소유권을 변경하십시오.

그런 다음 프로젝트에서 해당 사용자로 "authbind node ..."를 수행하십시오.


1

server.js에서 포트 번호를 변경하면 오류가 해결되었습니다.

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

포트 번호를 8080에서 8085로 변경했습니다.

도움이 되길 바랍니다.


0

여러 가지 다른 방법으로 시도한 후에 Windows에 IIS를 다시 설치하면 문제가 해결되었습니다.


0

내 오류는 (Windows에서)를 사용하여 해결되었습니다.

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

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

NodeJS 앱이 Windows 방화벽의 네트워크에 액세스하도록 허용하십시오.


0

재시작이 충분하지 않았습니다! 이 문제를 해결하는 유일한 방법은 다음과 같습니다.

해당 포트에서 실행되는 서비스를 종료해야합니다.

cmd에서 admin으로 실행 한 후 다음을 입력하십시오. netstat -aon | / i "듣기"찾기

그런 다음 활성 서비스가있는 목록을 얻고 4200에서 실행중인 포트를 검색하고 마지막 열인 프로세스 ID를 사용하여

: taskkill / F / PID 2652

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.