Gitsunmin

TIL

TIL
(=Today I Learned)

About PM2

PM2는 Node.js 및 기타 자바스크립트 런타임 기반 애플리케이션을 백그라운드에서 안정적으로 실행하고, 자동 재시작, 리소스 모니터링, 로깅, 클러스터링 등의 기능을 제공하는 프로세스 관리자이다. 특히 운영 환경에서 서버 애플리케이션을 항상 실행 가능한 상태로 유지하는 데 유용하다.


주요 개념

  • 프로세스 관리: 애플리케이션을 데몬 형태로 실행하여 종료되지 않도록 유지.
  • 자동 재시작: 예기치 않은 오류 발생 시 자동으로 재시작.
  • 로그 관리: 표준 출력(stdout)과 에러(stderr) 로그를 별도 저장.
  • 클러스터링 지원: 다중 CPU 코어를 활용하여 성능 최적화.

주요 명령어

pm2 start app.js                      # JavaScript 애플리케이션 실행
pm2 start src/index.ts --interpreter bun  # bun 런타임으로 TypeScript 파일 실행
pm2 stop all                          # 실행 중인 모든 프로세스 중지
pm2 restart my-app                    # 특정 앱 재시작
pm2 delete all                        # 모든 프로세스 중지 및 목록에서 제거
pm2 list                              # 실행 중인 앱 목록 간략히 보기
pm2 status                            # 프로세스 상태 요약 보기
pm2 logs                              # 실시간 로그 확인
pm2 monit                             # CPU, 메모리 등 리소스 실시간 모니터링

ecosystem.config.js 예시

PM2는 여러 애플리케이션을 구성 파일 하나로 관리할 수 있도록 ecosystem.config.js를 지원한다.

module.exports = {
  apps: [
    {
      name: "my-app",
      script: "src/index.ts",
      interpreter: "bun",
      watch: true,                // 파일 변경 시 자동 재시작
      instances: 1,               // 클러스터 모드 사용 시 인스턴스 수
      env: {
        NODE_ENV: "development"
      },
      env_production: {
        NODE_ENV: "production"
      }
    }
  ]
}

Bun과 함께 사용할 때 주의사항

  • --interpreter bun 옵션을 사용하면 .ts 파일을 직접 실행할 수 있음
  • bun은 자체적으로 TypeScript 실행 기능을 제공하므로 별도 빌드 없이도 구동 가능
  • bun이 시스템 PATH에 있어야 PM2가 인식 가능

상태 점검 및 헬스체크 팁

  • PM2 로그 확인: pm2 logs 또는 pm2 logs <앱이름>
  • 애플리케이션 내에 /health 등의 엔드포인트를 만들어 curl 등으로 상태 확인 가능
  • 포트 점유 여부 확인: lsof -i :3000, netstat -anp

기타 팁

  • 설정 변경 후 pm2 reload ecosystem.config.js로 반영 가능
  • PM2 상태 영구 저장: pm2 save
  • 시스템 재부팅 시 자동 실행 설정: pm2 startup

PM2는 단순한 실행 도구를 넘어, 운영 환경에서 안정성을 높이는 데 핵심적인 역할을 한다. 특히 Bun과 함께 사용할 경우, 설정만 정확히 해주면 컴파일 없이 TypeScript 애플리케이션을 매우 빠르게 배포할 수 있다.