사용자 도구

사이트 도구


wiki:glossary:server_operations:pm2

문서의 이전 판입니다!


⚡ PM2

PM2는 Node.js 애플리케이션을 위한 프로덕션 프로세스 관리자로, 애플리케이션을 항상 활성 상태로 유지하고 성능을 모니터링합니다.

📋 정의

PM2는 Node.js 애플리케이션을 위한 오픈소스 프로세스 관리자입니다. 애플리케이션을 데몬으로 실행하고, 클러스터 모드를 지원하며, 로드 밸런싱과 모니터링 기능을 제공합니다.

🎯 주요 특징

1. 프로세스 관리 - 애플리케이션을 백그라운드에서 실행 - 자동 재시작 기능 - 프로세스 상태 모니터링

2. 클러스터 모드 - CPU 코어 수에 맞춰 여러 인스턴스 실행 - 로드 밸런싱 자동 처리 - 고가용성 보장

3. 모니터링 및 로깅 - 실시간 성능 모니터링 - 로그 관리 및 로테이션 - 메트릭 수집

🚀 설치 및 기본 사용법

PM2 설치:

# 전역 설치
npm install -g pm2
 
# 버전 확인
pm2 --version

기본 명령어:

# 애플리케이션 시작
pm2 start app.js
 
# 이름 지정하여 시작
pm2 start app.js --name "my-app"
 
# 클러스터 모드로 시작
pm2 start app.js -i max
 
# 특정 포트로 시작
pm2 start app.js -- --port 3000

⚙️ 설정 파일

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
    },
    // 로그 설정
    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'
  }]
};

🎮 프로세스 관리

프로세스 제어:

# 애플리케이션 중지
pm2 stop my-app
 
# 애플리케이션 재시작
pm2 restart my-app
 
# 애플리케이션 삭제
pm2 delete my-app
 
# 모든 애플리케이션 중지
pm2 stop all
 
# 모든 애플리케이션 재시작
pm2 restart all

상태 확인:

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

📊 모니터링

대시보드 실행:

# 실시간 모니터링 대시보드
pm2 monit

성능 모니터링:

# CPU/메모리 사용량 확인
pm2 show my-app
 
# 로그 파일 크기 확인
pm2 flush
 
# 메트릭 확인
pm2 web

메트릭 수집:

# PM2 메트릭 활성화
pm2 install pm2-server-monit
 
# 커스텀 메트릭 추가
pm2 install pm2-custom-metrics

🔄 자동화

시스템 부팅 시 자동 시작:

# PM2 시작 스크립트 생성
pm2 startup
 
# 현재 실행 중인 앱들을 저장
pm2 save
 
# 저장된 앱들을 복원
pm2 resurrect

배포 스크립트:

#!/bin/bash
# deploy.sh
 
echo "🚀 배포 시작..."
 
# 기존 프로세스 중지
pm2 stop baduk-metaverse
 
# 코드 업데이트 (git pull 등)
git pull origin main
 
# 의존성 설치
npm install
 
# 프로덕션 환경으로 시작
pm2 start ecosystem.config.js --env production
 
# 상태 확인
pm2 list
 
echo "✅ 배포 완료!"

🛠️ 문제 해결

일반적인 문제들:

1. 메모리 부족:

# 메모리 사용량 확인
pm2 show my-app
 
# 메모리 제한 설정
pm2 start app.js --max-memory-restart 1G

2. 로그 파일이 너무 큼:

# 로그 파일 정리
pm2 flush
 
# 로그 로테이션 설정
pm2 install pm2-logrotate

3. 프로세스가 자주 재시작됨:

# 재시작 횟수 확인
pm2 show my-app
 
# 로그에서 에러 확인
pm2 logs my-app --err

4. 포트 충돌:

# 사용 중인 포트 확인
netstat -tulpn | grep :3000
 
# 다른 포트로 실행
pm2 start app.js -- --port 3001

📈 성능 최적화

클러스터 모드 설정:

// server.js에서 클러스터 모드 지원
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
 
if (cluster.isMaster) {
    console.log(`마스터 프로세스 ${process.pid} 실행 중`);
 
    // 워커 프로세스 생성
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
 
    cluster.on('exit', (worker, code, signal) => {
        console.log(`워커 ${worker.process.pid} 종료`);
        cluster.fork(); // 새로운 워커 생성
    });
} else {
    // 워커 프로세스에서 서버 실행
    require('./server.js');
}

메모리 최적화:

// 주기적인 메모리 정리
setInterval(() => {
    if (global.gc) {
        global.gc();
        console.log('🧹 가비지 컬렉션 실행');
    }
}, 60000); // 1분마다

🔧 고급 설정

로드 밸런싱:

# 로드 밸런서 설정
pm2 start ecosystem.config.js -i 4
 
# 특정 포트로 바인딩
pm2 start server.js --name "baduk-1" -- --port 3001
pm2 start server.js --name "baduk-2" -- --port 3002

환경별 설정:

// ecosystem.config.js
module.exports = {
  apps: [{
    name: 'baduk-metaverse',
    script: 'server.js',
    instances: 'max',
    env: {
      NODE_ENV: 'development',
      PORT: 3000
    },
    env_staging: {
      NODE_ENV: 'staging',
      PORT: 3001
    },
    env_production: {
      NODE_ENV: 'production',
      PORT: 3000
    }
  }]
};

헬스체크 설정:

// 헬스체크 엔드포인트
app.get('/health', (req, res) => {
    res.status(200).json({
        status: 'ok',
        timestamp: new Date().toISOString(),
        uptime: process.uptime()
    });
});

📚 관련 용어

🔗 관련 문서

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

wiki/glossary/server_operations/pm2.1753857794.txt.gz · 마지막으로 수정됨: 저자 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki