잘 돌아가던 서버가 갑자기 켜지지 않을 때
리눅스 서버에서 Nginx, Apache, Tomcat 같은 웹 서버나 애플리케이션 서비스를 실행(또는 재시작)할 때, 개발자라면 누구나 한 번쯤 마주치는 짜증 나는 에러가 있습니다.
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
바로 "이미 사용 중인 주소(포트)입니다"라는 의미의 포트 충돌 에러입니다.
분명히 서비스를 종료하고 다시 켰는데 왜 이런 현상이 발생할까요? 가장 흔한 원인은 서버를 재시작하는 과정에서 이전 프로세스가 정상적으로 완전히 종료되지 않고 백그라운드에 '좀비 프로세스'로 남아 해당 포트(예: 80번)를 계속 쥐고 있거나, 자동 실행 설정으로 인해 이미 동일한 서비스가 몰래 실행되고 있기 때문입니다.
오늘은 이렇게 억울하게 점유당한 포트를 찾아내고, 원인이 되는 프로세스를 안전하고 확실하게 강제 종료하는 3단계 트러블슈팅 방법을 정리해 보겠습니다.
1단계: 어떤 프로세스가 포트를 점유하고 있는지 찾기 (netstat)
가장 먼저 해야 할 일은 내가 사용하려는 포트를 도대체 어떤 녀석이 쓰고 있는지 알아내는 것입니다. 이때 리눅스의 네트워크 연결 상태를 보여주는 netstat 명령어를 사용합니다.
예를 들어, 80번 포트를 사용 중인 프로세스를 찾고 싶다면 터미널에 아래와 같이 입력합니다.
| netstat -lntp | grep 80 |
명령어 옵션 상세 설명:
-l (listen): 현재 연결을 기다리고 있는(Listen 상태인) 포트만 보여줍니다.
-n (numeric): 도메인 주소 대신 숫자로 된 IP 주소와 포트 번호를 직관적으로 보여줍니다.
-t (tcp): TCP 프로토콜 연결만 보여줍니다.
-p (program): 해당 포트를 사용 중인 프로그램의 이름과 프로세스 ID(PID)를 보여줍니다. (이 옵션은 root 권한이 필요할 수 있습니다.)
| grep 80: 출력된 수많은 네트워크 목록 중 '80'이라는 숫자가 포함된 줄만 필터링합니다.
[검색 결과 예시]
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2305/nginx
결과를 보면 맨 우측에 2305/nginx라는 값을 확인할 수 있습니다. 즉, 2305라는 프로세스 ID(PID)를 가진 nginx 프로그램이 80번 포트를 물고 있다는 뜻입니다.
2단계: 해당 프로세스의 상세 정보 확인하기 (ps)
1단계에서 범인의 PID(2305)를 찾았다고 해서 무작정 죽이는 것은 서버 운영에 있어 다소 위험할 수 있습니다. 내가 종료하려는 프로세스가 정말 문제가 되는 프로세스가 맞는지, 시스템 핵심 프로세스는 아닌지 ps 명령어로 한 번 더 상세히 검증하는 습관을 들이는 것이 좋습니다.
| ps -ef | grep 2305 |
[검색 결과 예시]
nginx 2305 1 0 09:53 ? 00:00:00 nginx: worker process
결과를 통해 이 프로세스가 언제 실행되었고, 정확히 어떤 경로와 명령어로 실행된 워커 프로세스인지 확인할 수 있습니다. 확인 결과, 불필요하게 떠 있는 프로세스가 맞다는 확신이 들었다면 이제 종료할 차례입니다.
3단계: 프로세스 강제 종료하여 포트 확보하기 (kill)
원인이 되는 프로세스의 정체를 확인했으니, 이제 해당 프로세스를 강제로 종료시켜 묶여있던 포트를 해제해 주어야 합니다. 프로세스를 종료할 때는 kill 명령어를 사용합니다.
| kill -9 2305 |
옵션 설명:
명령어 뒤에 종료할 PID(2305)를 적어줍니다. 여기서 사용된 -9 옵션은 강력한 '강제 종료(SIGKILL)' 신호입니다. 프로세스가 정상적인 종료 명령을 무시하고 응답하지 않더라도, 운영체제(OS) 단에서 즉각적이고 강제적으로 프로세스를 메모리에서 삭제해 버립니다.
명령어를 실행한 후 아무런 에러 메시지가 뜨지 않았다면 성공입니다. 다시 1단계의 netstat 명령어를 쳐보면 80번 포트가 깔끔하게 비워진 것을 확인할 수 있습니다. 이제 멈춰있던 여러분의 서비스를 정상적으로 다시 실행하시면 됩니다!
보너스 팁: 최신 리눅스 환경이라면 lsof 명령어 활용하기
최근 실무에서는 netstat 명령어 대신 lsof 명령어를 활용하여 포트 점유 상태를 확인하는 경우가 많습니다. 아래 명령어 한 줄이면 훨씬 빠르고 직관적으로 색출할 수 있습니다.
| # 80번 포트를 사용 중인 프로세스 즉시 조회 lsof -i :80 |
이 팁까지 기억해 두신다면 실무에서 한층 더 능숙하게 서버 트러블슈팅을 해내실 수 있을 것입니다.