오류를 수정하는 방법 : nodejs를 사용하는 동안 EADDRINUSE 듣기?

포트 80으로 서버를 실행하고 xmlHTTPrequest 를 사용하려고 하면이 오류가 발생합니다.Error: listen EADDRINUSE

포트 80에서 서버를 실행하는 동안 요청을하고 싶다면 nodejs에 왜 문제가 있습니까? 웹 브라우저의 경우 문제가되지 않습니다. 서버가 실행되는 동안 인터넷에서 서핑 할 수 있습니다.

서버는 다음과 같습니다

  net.createServer(function (socket) {
    socket.name = socket.remoteAddress + ":" + socket.remotePort;
    console.log('connection request from: ' + socket.remoteAddress);
    socket.destroy();
  }).listen(options.port);

그리고 요청 :

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
    sys.puts("State: " + this.readyState);

    if (this.readyState == 4) {
        sys.puts("Complete.\nBody length: " + this.responseText.length);
        sys.puts("Body:\n" + this.responseText);
    }
};

xhr.open("GET", "http://mywebsite.com");
xhr.send();



답변

EADDRINUSElisten()서버를 바인드 하려는 포트 번호 가 이미 사용 중임을 의미합니다 .

따라서 귀하의 경우 포트 80에서 서버를 이미 실행 중이어야합니다.

이 포트에서 다른 웹 서버를 실행중인 경우 해당 서버 뒤에 node.js를 배치하고이를 통해 프록시해야합니다.

listening서버가 실제로 수신 중인지 확인하려면 다음 과 같은 이벤트를 확인해야합니다.

var http=require('http');

var server=http.createServer(function(req,res){
    res.end('test');
});

server.on('listening',function(){
    console.log('ok, server is running');
});

server.listen(80);


답변

나에게 정말로 도움이 된 것은 :

killall -9 node

그러나 이것은 시스템 프로세스를 죽일 것입니다.

ps ax

작동하는지 확인할 수 있습니다.


답변

killall -9 nodePatrick이 제안한 전술 한 내용 은 예상대로 작동하고 문제를 해결하지만 이유에 대한이 답변의 편집 부분을 읽으십시오.kill -9 최선의 방법이 아닐 수 수 있습니다.

게다가 맹목적으로 모든 것을 죽이지 않고 단일 프로세스 를 목표로 할 수 있습니다. 활성 프로세스를 .

이 경우 먼저 해당 포트에서 실행중인 프로세스의 프로세스 ID (PID)를 가져 오십시오 (예 : 8888).

lsof -i tcp:8888

이것은 다음과 같은 것을 반환합니다 :

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1 (LISTEN)

그런 다음 그냥하십시오 (ps-실제로 하지 않습니다 . 아래에서 계속 읽으십시오).

kill -9 57385

여기 에 대해 좀 더 읽을 수 있습니다 .

편집 : 나는 오늘 상당히 관련있는 주제를 읽고 있었는데 왜 내가 kill -9프로세스가 아닌지에 대한 이 흥미로운 스레드를 우연히 발견했습니다 .

일반적으로 kill -9 전에 kill -15 를 사용하여 대상 프로세스가 자체적으로 정리 될 수있는 기회를 제공해야합니다. (프로세스는 SIGKILL을 포착하거나 무시할 수 없지만 SIGTERM을 포착 할 수 있으며 종종 포착합니다.) 프로세스가 수행중인 작업을 완료하고 정리할 기회를주지 않으면 손상된 파일 (또는 다른 상태)이 주변에 남을 수 있습니다. 다시 시작한 후에는 이해할 수 없습니다.

따라서 언급했듯이 위의 프로세스를 다음과 같이 더 잘 종료해야합니다.

kill -15 57385

편집 2 : 여기 여러 번 주석에서 언급 했듯이이 오류는 프로세스를 정상적으로 종료하지 않은 결과입니다. 즉, 많은 사람들이 CTRL + Z를 사용하여 노드 명령 (또는 다른 명령)을 종료합니다 . 실행중인 프로세스를 중지하는 올바른 방법은 클린 종료를 수행하는 CTRL + C 명령을 실행하는 것입니다.

프로세스를 올바르게 종료하면 종료하는 동안 해당 포트가 해제됩니다. 이렇게하면 프로세스를 다시 실행하기 전에 프로세스를 스스로 종료하지 않고도 프로세스를 다시 시작할 수 있습니다.


답변

Skype는 포트 80에서 수신 대기하므로 Node.js 또는 다른 앱에서 포트 80에서 수신하려고하면이 오류가 발생합니다.

옵션에 액세스하고 고급-> 연결-> 포트 80 사용을 클릭하여 Skype에서 해당 동작을 해제 할 수 있습니다 (확인 해제)

Skype 포트 80 사용 끄기

추신 : 변경 후 Skype를 다시 시작하는 것을 잊지 마십시오!


답변

포트 80에서 수신 대기중인 프로세스를 강제 종료해야합니다.

Killall은 실행중인 모든 노드 앱을 종료합니다. 그렇게하고 싶지 않을 수도 있습니다. 이 명령을 사용하면 알려진 포트에서 수신 대기중인 하나의 앱만 종료 할 수 있습니다.

유닉스를 사용하는 경우 다음 명령을 시도하십시오 :

sudo fuser -k 80/tcp    


답변

오류 이유 : 통화 중을 사용하려고합니다port number

Windows / Mac을위한 두 가지 가능한 솔루션

  1. 현재 사용중인 무료 포트 번호
  2. 현재 프로그램의 다른 포트 번호를 선택하십시오

1. 사용 가능한 포트 번호

윈도우

1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F

여기에 이미지 설명을 입력하십시오

netstat를 시도해 볼 수 있습니다

netstat -vanp tcp | grep 3000

OSX El Capitan 이상 (또는 netstat가 -p를 지원하지 않는 경우)의 경우 lsof를 사용하십시오

sudo lsof -i tcp:3000

이렇게해도 문제가 해결되지 않으면 Mac사용자는이 문제에 대한 완전한 토론을 참조 할 수 있습니다 (Mac에서 프로세스 3000 포트 잠금 찾기 및 종료).


2. 포트 번호를 변경 하시겠습니까?

윈도우

set PORT=5000

export PORT=5000


답변

컨트롤러 환경에서 다음을 사용할 수 있습니다.

pkill node 스크립트를 실행하기 전에 작업을 수행해야합니다.

이 명령은 모든 node 프로세스 즉, 하나의 인스턴스 만 실행하는 컨테이너가있는 경우에는 옳을 수 있습니다.

다른 시나리오에서는 프로그래밍 방식으로 찾은 특정 프로세스 ID 또는 이름을 종료하는 명령을 사용하는 것이 좋습니다. 프로세스가 호출 된 경우처럼 node-server-1 할 수 있습니다 pkill node-server-1.

이 리소스는 다음을 이해하는 데 도움이 될 수 있습니다.
https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/