programing

대부분의 포트에서 수신 중인 경우 Node.js EACCES 오류

starjava 2023. 5. 12. 20:08
반응형

대부분의 포트에서 수신 중인 경우 Node.js EACCES 오류

저는 앱을 테스트하고 있습니다(헤루쿠에서 실행하기를 희망하지만, 현지에서도 문제가 있습니다).그것은 http를 실행할 때 나에게 EACCES 오류를 주고 있습니다.Server.listen() - 그러나 일부 포트에서만 발생합니다.

그래서 저는 지역적으로 운영하고 있습니다.

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를 사용하면 해결됩니다.하지만, 이것은 내가 헤로쿠를 어떻게 고칠지 설명해주지 않습니다.헤로쿠에서 루트로 실행할 방법이 없는데 포트 80에서 어떻게 들을 수 있습니까?

워크스테이션에서 실행

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

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

헤로쿠로 달리기

herku에서 앱을 실행할 때는 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}`));

#윈도우즈

다른 이유는 포트가 몇 가지 이유로 제외되었을 수 있습니다.

따라서 관리자 권한에서 CMD(명령줄)를 열고 다음을 실행합니다.

  1. net stop winnat
  2. net start winnat

여기에 이미지 설명 입력

제 경우에는 충분했습니다.

솔루션은 여기에서 찾을 수 있습니다. https://medium.com/ @Bartleby/ports-as-not-available-listen-tcp-0-0-3000-165892441b9d

루트가 아닌 권한이 없는 사용자는 1024 미만의 포트에서 수신 소켓을 열 수 없습니다.

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

포트 80을 사용할 수 있는 안전한 사용자 권한 부여

응용 프로그램을 루트 사용자로 실행하지는 않지만 안전한 사용자에게 기본 HTTP 포트(80)를 사용할 수 있는 권한이 없다는 문제가 있습니다.하여 사용할 수 입니다.http://ip:port/

이 루트로 하지 않는 한, 당신은 " 을스럽게루도트로지않그하인합는다니다유한"와 같은 해야 할 입니다.http://ip:port여기서 포트 번호 > 1024.

많은 사람들이 여기에 갇히지만, 해결책은 쉽습니다.몇 가지 선택지가 있지만 이것이 제가 좋아하는 것입니다.다음 명령을 입력합니다.

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

이제 Node 응용 프로그램에 포트 80에서 실행하기를 원한다고 말하면 불만이 없습니다.

윈도우즈 시스템에서 "호스트 네트워크 서비스" 서비스를 다시 시작하면 문제가 해결되었습니다.

Windows(윈도우)를 사용하는 경우.윈도우즈 NAT 드라이버 서비스를 다시 시작해 보십시오.

명령 프롬프트를 관리자로 열고 실행

net stop winnat

그리고나서

net start winnat

바로 그겁니다.

가 노드 VPN을 설치했는데 자동으로 창이 뜨고 있어서 그런 일이 일어나고 있습니다.

스포일러 경고:이 대답은 약간 웃기게 보일 수 있습니다.

저는 제 시스템에서 이 오류의 근본 원인을 찾기 위해 10분 이상을 보냈습니다.는 이것을했습니다: 다니습했사.PORT=2000;내 .env 파일에 있습니다.

벌써 찾으셨으면 좋겠습니다.저는 PORT number :'(추가 기호를 제거하고 작동하기 시작했습니다.)를 선언한 후 세미콜론을 사용했습니다.

저는 이것이 이 질문에 대한 답이 아닐 수도 있다는 것을 알지만, 같은 문제에 직면한 다른 사람들에게 도움이 되기를 바랍니다.

또 다른 접근 방식은 포트 리디렉션입니다.

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

>1024 포트에서 서버를 실행합니다.

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

ps 참고로 https(443) 포트에서도 동일하게 할 수 있습니다.

세상에! 저 같은 경우에는.....listen(ip, port)...listen(port, ip) 그고그것오메토있하었다니습고를시지류.Error: listen EACCES localhost

포트 번호 >= 3000을 사용하고 있었고 관리자 액세스도 시도했습니다.아무 것도 안 풀렸어요.그러고 나서 자세히 살펴보니 문제가 있다는 것을 알아차렸습니다.로변됨으로 ....listen(port, ip)그리고 모든 것이 잘 작동하기 시작했습니다!!

다른 사람에게 도움이 될 경우를 대비해 이걸 불러내는 것은...

포트 8080에서 실행하는 것을 거부하는 것과 비슷한 문제가 있었습니다.

보니,은 알보니, 그은것 이었습니다.env.local같은 에 file it read와 같은 주석이 포함되어 있습니다.

PORT=8080 # The port the server runs at

그리고 그것은 포트를 사용하려고 노력하면서 그렇게 해석했습니다."8080 # The port the server runs at이는 분명히 잘못된 포트(-1)입니다.댓글을 삭제한 것이 완전히 해결되었습니다.

참고로 Windows 10과 Git Bash를 사용합니다.


여기서 설명한 문제가 아니라는 건 알지만 누군가에게 도움이 될 수도 있습니다.내 대답을 위해 문제를 찾느라 이 문제에 착수했어요, 그래서...아마도?

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

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

당신은 그 항구에서 운영되는 서비스를 중지해야 합니다.

다음 cmd를 합니다.netstat -aon | find /i "listening"

그런 다음 활성 서비스가 포함된 목록을 받고 4200n에서 실행 중인 포트를 검색한 다음 프로세스 ID를 사용하여 해당 포트를 종료합니다.

:taskkill /F /PID 2652

기본적으로 노드 서버가 사용하는 포트 80과 동일한 포트를 사용하여 Apache 서버를 실행했기 때문에 Mac에서 이 오류가 발생했습니다.내가 할 일은 그것을 막는 것뿐이었습니다.sudo apachectl stop

이것이 누군가에게 도움이 되기를 바랍니다.

sudo를 사용하여 포트 80에 바인딩하고 환경 변수 PORT & NODE_ENV를 사용하는 경우 사용자 프로파일이 아닌 루트 프로파일 아래에서 해당 변수를 다시 내보내야 합니다.Mac에서 이 작업을 수행하기 위해 다음 작업을 수행했습니다.

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

저도 제 맥에서 이 오류가 발생했습니다.사용합니다npm run devWindows에서 내 Nodejs 앱을 실행하면 잘 작동합니다. 제요 - ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅠerror given was: Error: bind EACCES null:80.

이 문제를 해결하는 한 가지 방법은 루트 액세스로 실행하는 것입니다.사용할 수 있습니다.sudo npm run dev비밀번호를 입력해야 합니다.

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

참조:http 80 포트에서 수신 중인 Node.js EACCES 오류(권한 거부)

로컬로 호스트하려는 포트가 포트 포워드된 경우 이 문제가 발생합니다.

인증 바인딩 시도:

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

설치 후 /etc/authbind/byport/ 폴더에서 사용할 포트 번호의 이름을 가진 파일을 추가할 수 있습니다.

chmod를 사용하여 500개의 권한을 부여하고 프로그램을 실행할 사용자에게 소유권을 변경합니다.

그런 다음 "authbind node..."를 프로젝트의 해당 사용자로 수행합니다.

(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 방화벽의 네트워크에 액세스하도록 허용합니다.

server.js Special 이 줄에서 포트 번호를 변경하는 것만으로 오류가 해결되었습니다.

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

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

도움이 되길 바랍니다.

이 문제는 PowerShell의 Windows에 있는 모든 호스트와 모든 포트에 영향을 주었습니다.

네트워크 인터페이스를 사용하지 않도록 설정하면 문제가 해결됩니다.

와이파이와 이더넷 연결을 하고 이더넷 인터페이스를 비활성화하여 이 문제를 해결했습니다.

인터페이스를 보려면 "네트워크 연결"을 엽니다.마우스 오른쪽 단추를 클릭하고 "사용 안 함"을 선택합니다.

이는 포트가 다른 곳에서 사용되고 있음을 의미하므로 다른 포트를 시도하거나 이전 포트 사용을 중지해야 합니다.

위에서 제시한 모든 답변을 시도했지만 아무 것도 되지 않았습니다. 그리고 나서 저는 제가 덧붙이는 것을 잊었다는 것을 알았습니다.const변수를 선언하기 전에.env파일.

이전:

PORT = 5000;
HOST = "127.0.0.1";

이후:

const PORT = 5000;
const HOST = "127.0.0.1";

따라서 가능한 이유는 환경 변수 이름을 입력하거나 dotenv 패키지를 설치하지 않은 것과 관련이 있을 수 있습니다.

따라서 typo 및 dotenv npm 패키지 외에 다른 오류가 있는 경우 아래와 같은 솔루션을 사용해 보아야 합니다.

윈도우즈 전용의 첫 번째 솔루션

cmd를 administrator로 실행한 후 두 개의 명령을 작성합니다.

  1. net stop winnat
  2. net start winnat

이것으로 문제가 해결되기를 바랍니다...

윈도우즈 전용의 두 번째 솔루션

환경 변수에서 변수 끝에 세미콜론(")이 없고 변수 이름 뒤에 콜론(:)이 없는지 확인합니다.

예를 들어, 나는 내 환경 변수가 작동하지 않는 내 프로젝트에서 일하고 있었기 때문에 내 .env 파일의 구조는 다음과 같았습니다.PORT:5000; CONNECTION_URL:MongoDbString.<password>/<dbname>;그래서 그것은 나에게 이 오류를 주고 있었습니다.

Error: listen EACCES: permission denied 5000;
at Server.setupListenHandle [as _listen2] (node:net:1313:21)
at listenInCluster (node:net:1378:12)
at Server.listen (node:net:1476:5)
at Function.listen (E:\MERN REACT\mern_memories\server\node_modules\express\lib\application.js:618:24)
at file:///E:/MERN%20REACT/mern_memories/server/index.js:29:9
at processTicksAndRejections (node:internal/process/task_queues:96:5)

프로세스에서 서버 인스턴스에서 내보낸 '오류' 이벤트: atemitErrorNT(노드:net:1357:8)TicksAndRejects(노드:internal/process/task_queues:83:21) {코드: 'EACCES', errno: -4092, syscall: 'listen', 주소: '5000;', 포트: -1 } [nodemon] 앱이 충돌했습니다. 시작하기 전에 파일 변경을 기다리는 중...

그래서 이번에 env 파일을 몇 가지 변경했습니다. colon(:)을 제거하고 equal(=)로 교체하고 마지막에 세미콜론을 제거하여 .env 파일이 이렇게 되었습니다.

PORT = 5000
CONNECTION_URL = MongoDbString.<password>/<dbname>

이를 변경한 후 서버가 아무런 경고 없이 포트 5000에서 실행되고 문제가 발생했습니다.

이게 효과가 있기를...

#code #developers #mernstack #nodejs #react #윈도우즈 #호스트 서비스 네트워크 #http #권한 거부 #EACCES:-4092

2023

Linux(모든 배포)

사용할 수 있습니다.CAP_NET_BIND_SERVICE핵심 리눅스 기능 중 하나는 다음과 같습니다.

CAP_NET_BIND_SERVICE
인터넷 도메인 권한 포트(포트 번호가 1024보다 작음)에 소켓을 바인딩합니다.

1024개 미만의 포트에 액세스하려는 모든 이진에 영구적인 권한을 부여할 수 있습니다.

예를 들어 Node.js의 경우 다음과 같습니다.

sudo setcap CAP_NET_BIND_SERVICE=+eip $(which node)

나중에 다음을 실행하여 이 권한을 제거할 수도 있습니다.

setcap -r $(which node)

여러 가지 방법을 시도한 후 창에 IIS를 다시 설치하여 문제를 해결했습니다.

같은 문제가 저에게도 발생했습니다.수신 포트를 설정할 server.js 파일을 체크아웃해야 합니다.모든 곳에서 포트 번호를 현명하게 변경하면 문제가 해결되기를 바랍니다.

저에게는 .env 파일의 오류일 뿐입니다.각 줄의 끝에 있는 쉼표를 지웠더니 해결되었습니다.

이전:

HOST=127.0.0.1,

이후:

HOST=127.0.0.1

오류: EACCES: 권한 거부 3000; "PORT = 3000;"을 추가하는 동안 "PORT = 3000" . just semicolon"; 오류를 표시합니다.

세미콜론 제거 및 프로젝트 실행 성공

포트 5000에서 실행을 거부하는 것과 비슷한 문제가 있었습니다.

env.local 파일에 다음과 같은 변수 이름 뒤에 쉼표(';')가 포함되어 있었기 때문인 것으로 밝혀졌습니다.

PORT= 5000; 그리고 그것은 그것을 그렇게 해석했고, 그것은 분명히 잘못된 포트(-1)인 포트 "filename;"를 사용하려고 했습니다.';'를 제거하면 완전히 해결됩니다.

여기서 설명한 문제가 아니라는 건 알지만 누군가에게 도움이 될 수도 있습니다.내 대답을 위해 문제를 찾느라 이 문제에 착수했어요, 그래서...아마도?

이것은 저에게 완벽하게 잘 작동했습니다. 대신 이 코드로 페이지 하단에 포트를 설정하십시오.

     let port = process.env.PORT;
if (port == null || port == "") {
    port = 3000;
}

app.listen(port, function() {
    console.log('app started successfully')
});

언급URL : https://stackoverflow.com/questions/9164915/node-js-eacces-error-when-listening-on-most-ports

반응형