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.1753683063.txt.gz · 마지막으로 수정됨: 저자 syjang0803