사용자 도구

사이트 도구


wiki:it:dream_of_enc:metaverse:pm2

⚡ PM2 프로세스 관리

Phaser Baduk Metaverse 프로젝트의 PM2를 사용한 프로세스 관리에 대해 설명합니다.


1. PM2란 무엇인가요?

PM2Node.js 애플리케이션을 위한 프로덕션 프로세스 관리자입니다. 애플리케이션이 갑자기 종료되어도 자동으로 재시작하고, 성능을 모니터링할 수 있게 해줍니다.

주요 특징:

  • 자동 재시작 - 애플리케이션이 종료되면 자동으로 다시 시작합니다.
  • 로드 밸런싱 - 여러 CPU 코어를 활용하여 성능을 향상시킵니다.
  • 로그 관리 - 애플리케이션 로그를 체계적으로 관리합니다.
  • 모니터링 - 실시간으로 애플리케이션 상태를 확인합니다.
  • 클러스터 모드 - 여러 인스턴스를 동시에 실행합니다.

왜 PM2를 사용하나요?

  • 개발 환경에서는 node server.js로 실행하지만, 실제 서비스에서는 안정성이 중요합니다.
  • 서버가 갑자기 다운되어도 자동으로 복구됩니다.
  • 트래픽이 많을 때 여러 프로세스로 분산 처리합니다.

2. 설치 및 기본 사용법

1) PM2 설치

npm install -g pm2

설명:

  • -g 옵션으로 전역 설치합니다.
  • 모든 프로젝트에서 PM2를 사용할 수 있습니다.

2) 기본 실행 방법

# 단순 실행
pm2 start server.js
 
# 이름 지정 실행
pm2 start server.js --name "baduk-metaverse"
 
# 클러스터 모드 실행 (CPU 코어 수만큼)
pm2 start server.js -i max

설명:

  • pm2 start server.js - 기본 실행
  • –name - 애플리케이션에 이름 부여
  • -i max - CPU 코어 수만큼 인스턴스 생성

3) 환경별 실행

# 개발 환경 실행
pm2 start server.js --env development
 
# 프로덕션 환경 실행
pm2 start server.js --env production

설명:

  • –env 옵션으로 환경을 설정합니다.
  • 개발/프로덕션 환경에 따라 다른 설정을 적용합니다.

3. 설정 파일 (ecosystem.config.js)

1) 기본 설정 파일 생성

프로젝트 루트에 ecosystem.config.js 파일을 생성합니다:

module.exports = {
  apps: [{
    name: 'baduk-metaverse',
    script: 'server.js',
    instances: 'max',
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'development',
      PORT: 3000
    },
    env_production: {
      NODE_ENV: 'production',
      PORT: 3000
    }
  }]
};

설명:

  • name - 애플리케이션 이름
  • script - 실행할 파일
  • instances - 실행할 인스턴스 수 (max = CPU 코어 수)
  • exec_mode - 실행 모드 (cluster = 클러스터 모드)
  • env - 개발 환경 변수
  • env_production - 프로덕션 환경 변수

2) 고급 설정

module.exports = {
  apps: [{
    name: 'baduk-metaverse',
    script: 'server.js',
    instances: 'max',
    exec_mode: 'cluster',
 
    // 환경 설정
    env: {
      NODE_ENV: 'development',
      PORT: 3000
    },
    env_production: {
      NODE_ENV: 'production',
      PORT: 3000
    },
 
    // 로그 설정
    log_file: './logs/combined.log',
    out_file: './logs/out.log',
    error_file: './logs/error.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
 
    // 자동 재시작 설정
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
 
    // 환경 변수 파일
    env_file: '.env'
  }]
};

설명:

  • log_file - 모든 로그를 저장할 파일
  • out_file - 표준 출력 로그 파일
  • error_file - 에러 로그 파일
  • log_date_format - 로그 시간 형식
  • autorestart - 자동 재시작 여부
  • watch - 파일 변경 감지 여부
  • max_memory_restart - 메모리 사용량 제한
  • env_file - 환경 변수 파일 경로

3) 로그 디렉토리 생성

# 로그 디렉토리 생성
mkdir logs

설명:

  • PM2가 로그 파일을 저장할 디렉토리를 생성합니다.
  • 설정 파일에서 지정한 경로와 일치해야 합니다.

4. 기본 명령어

1) 프로세스 관리

# 설정 파일로 애플리케이션 시작
pm2 start ecosystem.config.js
 
# 특정 환경으로 시작
pm2 start ecosystem.config.js --env production
 
# 애플리케이션 중지
pm2 stop baduk-metaverse
 
# 애플리케이션 재시작
pm2 restart baduk-metaverse
 
# 애플리케이션 삭제
pm2 delete baduk-metaverse
 
# 모든 애플리케이션 중지
pm2 stop all
 
# 모든 애플리케이션 재시작
pm2 restart all

설명:

  • pm2 start - 애플리케이션 시작
  • pm2 stop - 애플리케이션 중지
  • pm2 restart - 애플리케이션 재시작
  • pm2 delete - 애플리케이션 완전 삭제

2) 상태 확인

# 실행 중인 프로세스 목록
pm2 list
 
# 상세 정보 확인
pm2 show baduk-metaverse
 
# 로그 확인
pm2 logs baduk-metaverse
 
# 실시간 로그 모니터링
pm2 logs baduk-metaverse --lines 100
 
# 시스템 정보 확인
pm2 monit

설명:

  • pm2 list - 현재 실행 중인 모든 애플리케이션 목록
  • pm2 show - 특정 애플리케이션의 상세 정보
  • pm2 logs - 로그 확인
  • pm2 monit - 실시간 모니터링 대시보드

3) 로그 관리

# 로그 파일 크기 확인
pm2 flush
 
# 로그 파일 삭제
pm2 flush baduk-metaverse
 
# 로그 파일 경로 확인
pm2 describe baduk-metaverse

설명:

  • pm2 flush - 로그 파일 정리
  • pm2 describe - 애플리케이션 설정 정보 확인

5. 고급 기능

1) 클러스터 모드

# CPU 코어 수만큼 인스턴스 실행
pm2 start server.js -i max
 
# 특정 개수만큼 인스턴스 실행
pm2 start server.js -i 4
 
# 인스턴스 수 조정
pm2 scale baduk-metaverse 8

설명:

  • -i max - 모든 CPU 코어 사용
  • -i 4 - 4개의 인스턴스 실행
  • pm2 scale - 실행 중인 인스턴스 수 조정

2) 파일 변경 감지

module.exports = {
  apps: [{
    name: 'baduk-metaverse',
    script: 'server.js',
    watch: true,
    ignore_watch: ['node_modules', 'logs'],
    watch_delay: 1000
  }]
};

설명:

  • watch: true - 파일 변경 시 자동 재시작
  • ignore_watch - 감지하지 않을 폴더/파일
  • watch_delay - 변경 감지 후 대기 시간 (밀리초)

3) 메모리 제한

module.exports = {
  apps: [{
    name: 'baduk-metaverse',
    script: 'server.js',
    max_memory_restart: '1G',
    node_args: '--max-old-space-size=1024'
  }]
};

설명:

  • max_memory_restart - 메모리 사용량 제한
  • node_args - Node.js 실행 옵션

6. 모니터링 및 로깅

1) 실시간 모니터링

# 실시간 대시보드
pm2 monit
 
# 웹 대시보드 (PM2 Plus)
pm2 plus

설명:

  • pm2 monit - 터미널 기반 실시간 모니터링
  • pm2 plus - 웹 기반 모니터링 (PM2 Plus 계정 필요)

2) 로그 설정

module.exports = {
  apps: [{
    name: 'baduk-metaverse',
    script: 'server.js',
 
    // 로그 설정
    log_file: './logs/combined.log',
    out_file: './logs/out.log',
    error_file: './logs/error.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
 
    // 로그 로테이션
    max_size: '20M',
    log_type: 'json'
  }]
};

설명:

  • log_file - 모든 로그 통합 파일
  • out_file - 표준 출력 로그
  • error_file - 에러 로그
  • max_size - 로그 파일 최대 크기
  • log_type - 로그 형식

3) 로그 확인

# 실시간 로그 확인
pm2 logs
 
# 특정 애플리케이션 로그
pm2 logs baduk-metaverse
 
# 최근 100줄 로그
pm2 logs baduk-metaverse --lines 100
 
# 에러 로그만 확인
pm2 logs baduk-metaverse --err

설명:

  • pm2 logs - 모든 애플리케이션의 실시간 로그
  • –lines - 표시할 로그 줄 수
  • –err - 에러 로그만 표시

7. 프로덕션 환경 설정

1) 프로덕션용 설정 파일

module.exports = {
  apps: [{
    name: 'baduk-metaverse',
    script: 'server.js',
    instances: 'max',
    exec_mode: 'cluster',
 
    // 프로덕션 환경 설정
    env_production: {
      NODE_ENV: 'production',
      PORT: 3000,
      DB_HOST: 'localhost',
      DB_PORT: 27017,
      JWT_SECRET: 'your-secret-key'
    },
 
    // 성능 최적화
    max_memory_restart: '1G',
    node_args: '--max-old-space-size=1024',
 
    // 로그 설정
    log_file: './logs/combined.log',
    out_file: './logs/out.log',
    error_file: './logs/error.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
 
    // 자동 재시작
    autorestart: true,
    watch: false,
 
    // 환경 변수 파일
    env_file: '.env.production'
  }]
};

2) 프로덕션 실행

# 프로덕션 환경으로 시작
pm2 start ecosystem.config.js --env production
 
# 시스템 부팅 시 자동 시작 설정
pm2 startup
pm2 save

설명:

  • –env production - 프로덕션 환경 설정을 사용합니다.
  • pm2 startup - 시스템 부팅 시 PM2를 자동으로 시작합니다.
  • pm2 save - 현재 상태를 저장하여 부팅 시 복원합니다.

8. 문제 해결

1) 일반적인 문제들

애플리케이션이 시작되지 않는 경우:

# 로그 확인
pm2 logs baduk-metaverse
 
# 상세 정보 확인
pm2 show baduk-metaverse
 
# 애플리케이션 재시작
pm2 restart baduk-metaverse

메모리 사용량이 높은 경우:

# 메모리 사용량 확인
pm2 monit
 
# 메모리 제한 설정
pm2 restart baduk-metaverse --max-memory-restart 1G

로그 파일이 너무 큰 경우:

# 로그 파일 정리
pm2 flush
 
# 로그 로테이션 설정 확인
pm2 describe baduk-metaverse

2) 디버깅

# 디버그 모드로 실행
pm2 start server.js --node-args="--inspect"
 
# 상세 로그 확인
pm2 logs baduk-metaverse --lines 200
 
# 프로세스 정보 확인
pm2 show baduk-metaverse

9. 실습 예제

1) 간단한 PM2 설정

1단계: ecosystem.config.js 생성

module.exports = {
  apps: [{
    name: 'my-app',
    script: 'server.js',
    instances: 2,
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'development',
      PORT: 3000
    }
  }]
};

2단계: 애플리케이션 시작

pm2 start ecosystem.config.js

3단계: 상태 확인

pm2 list
pm2 monit

2) 로그 설정 예제

로그 디렉토리 생성:

mkdir logs

설정 파일에 로그 설정 추가:

module.exports = {
  apps: [{
    name: 'my-app',
    script: 'server.js',
    log_file: './logs/combined.log',
    out_file: './logs/out.log',
    error_file: './logs/error.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss Z'
  }]
};

로그 확인:

pm2 logs my-app

10. 다음 단계

PM2 기본을 배웠다면 다음을 학습해보세요:

  • Docker 컨테이너화 - DockerPM2 함께 사용
  • Nginx 리버스 프록시 - 웹 서버와 PM2 연동
  • CI/CD 파이프라인 - 자동 배포 설정
  • 모니터링 도구 - PM2 Plus, New Relic
  • 로드 밸런싱 - 여러 서버에서 PM2 사용

추천 학습 순서:

이 페이지는 자동으로 생성되었습니다.

wiki/it/dream_of_enc/metaverse/pm2.txt · 마지막으로 수정됨: (바깥 편집)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki