idea·blog

SERVER ERROR CLINIC

EADDRINUSE (포트가 이미 사용 중)

내가 열려는 포트를 다른 프로세스가 이미 잡고 있습니다. 앱이 시작조차 못 하고 멈춘 상태입니다.

이 도구는 여러분의 서버에 접속하지 않습니다. 답한 내용만으로 확인할 순서를 정해주는 도구이며, 실제 로그를 대신하지 않습니다.

  1. 브라우저요청을 보낸 곳
  2. 인터넷이름 찾기·연결
  3. 프록시Nginx·Caddy
  4. 여기가 의심됩니다
  5. DB·외부 API앱이 부르는 곳

어느 로그를 볼까 로그를 뒤질 필요가 거의 없습니다. 그 포트의 주인을 찾는 명령 한 줄이면 끝납니다.

원인 후보 3

그 포트를 지금 누가 쓰고 있나요?

포트를 이미 잡고 있는 주인을 찾으면 원인이 바로 갈립니다.

서버에서 이 명령을 쳐보고, 아래에서 결과를 골라 주세요.

ss -ltnp | grep :3000

가장 먼저 확인할 것

이전 프로세스가 안 죽고 남아 있다

터미널만 닫았거나 재시작이 깔끔하지 않아 예전 프로세스가 포트를 계속 붙잡고 있습니다.

다른 후보가 하나씩 제외되면서 남은 원인입니다.

포트를 잡고 있는 프로세스의 이름과 번호를 확인합니다.

ss -ltnp | grep :3000

그다음 위 명령에 나온 pid를 정확히 지정해 종료합니다. 이름으로 한꺼번에 죽이면 엉뚱한 프로세스까지 함께 내려갑니다.

아니라면 다음

다른 프로그램이 쓰는 포트다

개발 도구나 시스템 서비스가 이미 그 번호를 쓰고 있습니다. 3000·5432·8080처럼 흔한 번호에서 자주 겹칩니다.

누가 쓰고 있는지 이름으로 확인합니다.

ss -ltnp | grep :3000

그다음 상대를 죽이기보다 내 앱의 포트를 옮기는 쪽이 안전합니다. 데이터베이스나 시스템 서비스일 수 있습니다.

아니라면 다음

도커가 이미 그 포트를 밖으로 열어 뒀다

컨테이너의 포트 매핑이 호스트 포트를 잡고 있습니다. 컨테이너 목록에는 안 보여도 매핑은 살아 있을 수 있습니다.

어떤 컨테이너가 어느 호스트 포트를 열었는지 봅니다.

docker ps --format '{{.Names}}\t{{.Ports}}'

그다음 쓰지 않는 컨테이너를 내리거나 매핑 포트를 바꿉니다. 같은 컴포즈 파일을 두 번 올린 건 아닌지도 확인합니다.

실험을 마쳤다면