| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- 변수와 메서드
- git 기초
- 피연산자
- 원시타입
- 즉시로딩
- select
- foreigen key
- 메세지 큐
- 오버라이딩
- 추상메서드
- Java
- 멱등성
- 오버로딩
- Shared Lock
- 프로그래머스
- 지연로딩
- exclusive lock
- 서버 스크립트
- 컬렉션 프레임워크
- InterruptedException
- pm2
- N+1
- docker-compose
- 연산자와의 관계
- jsoup
- 변수와 상수
- null/not null
- 프로그래머스 코테
- delete
- SQL
- Today
- Total
개발하는 너구리
[Node] PM2(Process Manager2) 이해하기(1) 본문
PM2란 무엇인가? — Node.js 무중단 배포의 핵심 도구
1) PM2(Process Manager 2)
- Node.js 애플리케이션을 위한 프로세스 관리 도구
- node app.js로 서버를 띄우면 터미널을 닫는 순간 서버도 꺼진다.
=> PM2는 이런 문제를 해결하고, 서버가 죽으면 자동으로 다시 살려주고, 여러 프로세스를 동시에 관리해주는 도구다.
ex1) PM2 없이 서버를 띄운 경우
node dist/main.js
# 터미널 닫으면 → 서버 종료
# 에러 발생하면 → 서버 종료
# 배포하려면 → 서버 중단 후 재시작 (다운타임 발생)
ex2) PM2를 사용하는 경우
pm2 start dist/main.js
# 터미널 닫아도 → 서버 유지
# 에러 발생하면 → 자동 재시작
# 배포할 때 → 무중단 재시작 가능
PM2의 핵심 기능
1. 데몬(백그라운드) 실행
서버를 백그라운드에서 실행하기 때문에 SSH 연결이 끊기거나 터미널을 닫아도 서버가 계속 돌아간다.
2. 자동 재시작
애플리케이션이 예상치 못한 에러로 죽으면 PM2가 감지해서 자동으로 다시 띄워준다. 별도의 watchdog 같은 걸 설정할 필요가 없다.
3. 클러스터 모드
Node.js는 기본적으로 싱글 스레드다. PM2의 클러스터 모드를 사용하면 CPU 코어 수만큼 프로세스를 띄워서 요청을 분산 처리할 수 있다.
# CPU 코어 4개인 서버라면 → 4개의 프로세스가 요청을 나눠서 처리
pm2 start dist/main.js -i 4
4. 무중단 배포 (Zero-Downtime Reload)
이 글의 핵심이다. pm2 reload 명령어 하나로 서비스를 중단하지 않고 새 버전을 배포할 수 있다.
5. 로그 관리
pm2 logs # 전체 로그 보기
pm2 logs <앱 이름> # 특정 앱 로그
pm2 logs --lines 100 # 최근 100줄
6. 모니터링
pm2 monit # 실시간 CPU/메모리 모니터링
pm2 status # 전체 프로세스 상태 확인
무중단 배포가 어떤 방식으로 이루어지는가?
무중단 배포의 핵심 원리는 간단하다. "새 프로세스가 준비될 때까지 기존 프로세스가 요청을 계속 처리한다."
restart vs reload 차이
pm2 restart my-api # 모든 프로세스를 동시에 종료 → 재시작 (다운타임 발생)
pm2 reload my-api # 프로세스를 하나씩 순차적으로 교체 (다운타임 없음)
reload의 동작 과정
클러스터 모드에서 프로세스가 2개(A, B) 떠있다고 가정하자.
[1단계] 요청 → 프로세스 A (처리 중)
프로세스 B (처리 중)
[2단계] pm2 reload 실행
→ 새 프로세스 A' 생성
→ A'가 ready 신호를 보냄
→ 기존 A에게 SIGINT 전송 → A가 진행 중인 요청 마무리 후 종료
→ 이 동안 B가 계속 요청 처리
[3단계] A 교체 완료
→ 새 프로세스 B' 생성
→ B'가 ready 신호를 보냄
→ 기존 B에게 SIGINT 전송 → B가 진행 중인 요청 마무리 후 종료
→ 이 동안 A'가 계속 요청 처리
[4단계] 교체 완료
요청 → 프로세스 A' (새 버전)
프로세스 B' (새 버전)
이 과정에서 항상 최소 하나의 프로세스가 요청을 받고 있기 때문에 사용자는 서비스 중단을 경험하지 않는다.
무중단 배포를 위한 3가지 필수 조건
① 클러스터 모드 (instances ≥ 2)
프로세스가 1개뿐이면 그걸 교체하는 순간 요청을 받을 프로세스가 없다. 최소 2개 이상이어야 한다.
② wait_ready + ready 신호
새 프로세스가 DB 연결, 캐시 로딩 등 초기화를 마친 뒤에야 트래픽을 받아야 한다. 앱에서 process.send('ready')로 준비 완료를 알려주면, PM2가 그때서야 기존 프로세스를 종료한다.
③ Graceful Shutdown
기존 프로세스가 종료 신호를 받았을 때, 진행 중인 요청을 버리지 않고 마무리한 뒤 종료해야 한다. 이걸 Graceful Shutdown이라고 한다.
이 세 가지가 맞물려야 진짜 무중단 배포다. 하나라도 빠지면 요청 유실이 발생할 수 있다.
PM2와 비슷한 도구들
PM2만이 유일한 선택지는 아니다. 상황에 따라 다른 도구가 더 적합할 수 있다.
1. Docker + Nginx (블루-그린 배포)
컨테이너 두 개(Blue, Green)를 띄워놓고, Nginx가 트래픽을 라우팅하는 방식이다.
새 버전을 Green에 배포하고 헬스체크를 통과하면 Nginx가 트래픽을 Green으로 전환한다.
롤백이 쉽고 환경 일관성이 보장되지만 설정이 복잡하다.
| 항목 | PM2 | Docker + Nginx |
|---|---|---|
| 설정 난이도 | 낮음 | 중간 |
| 롤백 | 직접 처리 | 컨테이너 전환으로 간단 |
| 환경 격리 | 없음 | 완전 격리 |
| 적합한 규모 | 소규모~중규모 | 중규모~대규모 |
2. Kubernetes (k8s)
대규모 서비스에서 사용한다. Rolling Update, Canary 배포 같은 전략을 기본 지원하고, 오토스케일링까지 된다. 하지만 학습 곡선이 가파르고 인프라 비용도 크다. 개인 프로젝트나 소규모 서비스에는 과한 선택이다.
3. forever
PM2 이전에 많이 쓰이던 도구다. 단순히 프로세스를 백그라운드에서 유지하고 죽으면 재시작하는 기능만 있다.
클러스터 모드나 무중단 배포 기능이 없어서 현재는 PM2에 자리를 거의 넘겨줬다.
4. systemd
리눅스 시스템 자체의 서비스 관리자다. Node.js 전용이 아니라 범용적이고, 서버 부팅 시 자동 시작, 프로세스 감시 등의 기능이 있다. 다만 클러스터 모드나 무중단 배포를 자체적으로 지원하지 않기 때문에, Nginx와 조합해서 써야 한다.
어떤 걸 쓸까?
개인 프로젝트 / 소규모 서비스 → PM2
컨테이너 기반 / 환경 격리 필요 → Docker + Nginx
대규모 MSA / 오토스케일링 필요 → Kubernetes
다음 글에서는 NestJS 프로젝트에 PM2를 적용해서 실제로 무중단 배포 환경을 구축하는 과정을 단계별로 다룬다.
'Programming > Node' 카테고리의 다른 글
| [Node] PM2(Process Manager2) 이해하기(2) (0) | 2026.04.29 |
|---|