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
sudo kill -9 12733
sudo lsof -i :8080
입력... 그럼에도 8080포트는 계속해서 새로운 PID 가 할당 되었고, 서버를 재시작했을 때 위와 같은 문제가 반복되었다...
여러 시도를 해봤고, 혹시 nginx 문제인가 싶어 nginx도 재시작해줬지만 같은 문제가 반복되었다.
결국 8080번 포트를 버리고 3000번 포트를 통해 서버를 운용하기로 했다.
우선적으로 nginx 에서 HTTPS 연결된 리다이렉트 주소를 8080 -> 3000 번 포트로 바꿔 주었다.
😵💫 3000번 포트 사용 후 포트 현황을 보니 아직도 8080번 포트가 점거중임을 확인할 수 있었다...
😅 아마 서버가 비정상적으로 종료되어 그 과정이 꼬인 것 같은데, 그 비정상적인 종료가 왜 발생했고 포트는 왜 지속적으로 할당되었는지 파악하지 못했지만,
다른 방법을 통해 문제를 해결해 나갈 수 있었다.
몇 분 후 다시 sudo lsof -i :8080
를 통해 포트를 확인했더니 아무 포트도 사용되고 있지 않음을 확인했다.
아마 서버가 꺼지고 켜지는 과정에 로스가 발생했기 때문임을 예상할 수 있었다.