[Error: listen EADDRINUSE: address already in use :::8080]

박재현·2022년 5월 6일
0
post-custom-banner

🔎 에러 발생 경로

  • EC2 배포 후 pm2 start app.js 통해 서버를 켰을 때 이미 사용중인 포트라는 에러

  • 기존에는 파일질라를 통해 서버 코드 업데이트 후 pm2 를 재시작 하는 방법으로 서버를 시작했다.

  • pm2 kill, pm2 status 명령어를 통해 실행중인 서버가 없음에도 불구하고 pm2 start app.js로 서버를 시작했을 때 충돌이 난다.

Error: listen EADDRINUSE: address already in use :::8080
     at Server.setupListenHandle [as _listen2] (net.js:1300:14)
     at listenInCluster (net.js:1348:12)
     at Server.listen (net.js:1436:7)
     at Application.listen (/Users/username/MyProject/node_modules/koa/lib/application.js:80:19)
     at /Users/username/MyProject/src/server/index.js:28:9
     at tryCatcher (/Users/username/MyProject/node_modules/bluebird/js/release/util.js:16:23)
     at Promise._settlePromiseFromHandler (/Users/username/MyProject/node_modules/bluebird/js/release/promise.js:547:31)
     at Promise._settlePromise (/Users/username/MyProject/node_modules/bluebird/js/release/promise.js:604:18)
     at Promise._settlePromise0 (/Users/username/MyProject/node_modules/bluebird/js/release/promise.js:649:10)
     at Promise._settlePromises (/Users/username/MyProject/node_modules/bluebird/js/release/promise.js:729:18)
     at _drainQueueStep (/Users/username/MyProject/node_modules/bluebird/js/release/async.js:93:12)
     at _drainQueue (/Users/username/MyProject/node_modules/bluebird/js/release/async.js:86:9)
     at Async._drainQueues (/Users/username/MyProject/node_modules/bluebird/js/release/async.js:102:5)
     at Immediate.Async.drainQueues (/Users/username/MyProject/node_modules/bluebird/js/release/async.js:15:14)
     at processImmediate (internal/timers.js:439:21)
 Emitted 'error' event on Server instance at:
     at emitErrorNT (net.js:1327:8)
     at processTicksAndRejections (internal/process/task_queues.js:80:21) {
   code: 'EADDRINUSE',
   errno: 'EADDRINUSE',
   syscall: 'listen',
   address: '::',
   port: 5000
 }
 [nodemon] app crashed - waiting for file changes before starting...

🔐 시도 과정

  • 해당 에러를 구글링 했을 때 이미 나와 같은 문제를 겪은 사람이 여럿 있음을 알 수 있었다.

  • 문제 원인으로는 포트가 현재 다른 프로세스에서 사용 중이거나 NodeJS 프로세스가 이전에 비정상적으로 종료된 경우 나타나는 증상이라고 한다.

  • pm2 kill을 통해 서버를 종료한 후, 8080번 포트를 사용중인 목록을 봤다.

sudo lsof -i :8080

  • PID 12733 이 사용중이었고 이를 명령어를 통해 제거해줬다.
sudo kill -9 12733
  • 그 후 다시 sudo lsof -i :8080 입력...

  • 그럼에도 8080포트는 계속해서 새로운 PID 가 할당 되었고, 서버를 재시작했을 때 위와 같은 문제가 반복되었다...

  • 여러 시도를 해봤고, 혹시 nginx 문제인가 싶어 nginx도 재시작해줬지만 같은 문제가 반복되었다.


🔐 해결 과정

  • 결국 8080번 포트를 버리고 3000번 포트를 통해 서버를 운용하기로 했다.

  • 우선적으로 nginx 에서 HTTPS 연결된 리다이렉트 주소를 8080 -> 3000 번 포트로 바꿔 주었다.

  • 서버 코드에서도 연결 포트를 8080 -> 3000번으로 변경

  • 정상적으로 서버가 시작됨을 확인할 수 있다

😵‍💫 3000번 포트 사용 후 포트 현황을 보니 아직도 8080번 포트가 점거중임을 확인할 수 있었다...

😅 아마 서버가 비정상적으로 종료되어 그 과정이 꼬인 것 같은데, 그 비정상적인 종료가 왜 발생했고 포트는 왜 지속적으로 할당되었는지 파악하지 못했지만,

다른 방법을 통해 문제를 해결해 나갈 수 있었다.


몇 분 후 다시 sudo lsof -i :8080 를 통해 포트를 확인했더니 아무 포트도 사용되고 있지 않음을 확인했다.
아마 서버가 꺼지고 켜지는 과정에 로스가 발생했기 때문임을 예상할 수 있었다.

post-custom-banner

0개의 댓글