1. PM2란 무엇인가요?
- PM2(Process Manager 2)*는 Node.js 애플리케이션의 프로세스를 관리하고 모니터링하는 프로덕션 프로세스 매니저입니다. PM2를 사용하면 다음과 같은 이점을 얻을 수 있습니다:
- 애플리케이션의 가용성 향상: 자동 재시작, 로드 밸런싱, 클러스터링 등을 통해 애플리케이션의 가용성을 높입니다.
- 프로세스 관리 간소화: 애플리케이션의 시작, 중지, 재시작 등을 간단한 명령어로 수행할 수 있습니다.
- 모니터링 및 로깅: 실시간으로 애플리케이션의 상태와 로그를 확인할 수 있습니다.
- 자동화된 배포: 설정 파일을 통해 애플리케이션의 배포 및 관리를 자동화할 수 있습니다.
2. PM2의 주요 기능
2.1 프로세스 관리
- 시작, 중지, 재시작, 삭제: 애플리케이션 프로세스를 쉽게 관리할 수 있습니다.
- 클러스터링 지원: 여러 프로세스를 생성하여 멀티코어 CPU를 활용할 수 있습니다.
- 프로세스 제어: 특정 프로세스의 상태 확인, 로그 조회 등이 가능합니다.
2.2 자동 재시작
- 애플리케이션이 예기치 않게 종료되면 자동으로 재시작합니다.
-watch
옵션을 사용하면 파일 변경 시 자동으로 재시작할 수 있습니다.
2.3 로드 밸런싱
- 클러스터 모드를 통해 요청을 여러 프로세스에 분산시켜 처리량을 향상시킵니다.
2.4 로깅 및 로그 관리
- 표준 출력(stdout)과 에러 출력(stderr)을 자동으로 캡처하여 로그 파일로 저장합니다.
- pm2-logrotate 모듈을 통해 로그 파일의 크기 관리 및 로테이션을 지원합니다.
2.5 모니터링 및 디버깅
pm2 monit
명령어로 애플리케이션의 CPU, 메모리 사용량 등을 실시간으로 모니터링할 수 있습니다.- 애플리케이션의 상태를 실시간으로 확인하고, 이슈 발생 시 빠르게 대응할 수 있습니다.
2.6 환경 변수 및 설정 관리
- 환경 변수를 설정하여 애플리케이션의 동작을 제어할 수 있습니다.
- 설정 파일(
ecosystem.config.js
)*을 통해 애플리케이션의 구성 및 배포를 자동화할 수 있습니다.
2.7 서버 재부팅 시 자동 시작
pm2 startup
명령어를 통해 서버 재부팅 시 PM2가 자동으로 시작되도록 설정할 수 있습니다.pm2 save
명령어로 현재 프로세스 상태를 저장하여 재부팅 후 자동으로 복원합니다.
3. PM2의 일반적인 사용법
3.1 PM2 설치
npm install pm2 -g
- PM2를 전역으로 설치합니다.
3.2 애플리케이션 시작
pm2 start app.js
app.js
파일을 실행하여 애플리케이션을 시작합니다.
3.3 프로세스 관리 명령어
- 프로세스 목록 확인
pm2 list
- 프로세스 상태 확인
pm2 status
- 프로세스 재시작
pm2 restart [프로세스 이름 또는 ID]
- 프로세스 중지
pm2 stop [프로세스 이름 또는 ID]
- 프로세스 삭제
pm2 delete [프로세스 이름 또는 ID]
3.4 로그 관리
- 실시간 로그 확인
pm2 logs [프로세스 이름 또는 ID]
- 특정 라인 수만큼 로그 확인
pm2 logs [프로세스 이름 또는 ID] --lines [라인 수]
3.5 프로세스 설정 변경
- 환경 변수 설정
pm2 start app.js --name my-app --env production
- 인스턴스 수 설정
i max
는 가능한 모든 CPU 코어를 사용합니다.
pm2 start app.js -i max
3.6 프로세스 재로드
- Zero Downtime Reload
- 애플리케이션을 중단 없이 재시작합니다.
pm2 reload [프로세스 이름 또는 ID]
4. PM2 설정 파일: ecosystem.config.js
4.1 설정 파일의 역할
- 애플리케이션의 프로세스 설정을 코드로 관리할 수 있습니다.
- 여러 애플리케이션을 한꺼번에 관리하고, 복잡한 설정을 쉽게 적용할 수 있습니다.
4.2 기본 구조
module.exports = {
apps: [
{
name: 'my-app',
script: 'app.js',
instances: 1,
exec_mode: 'fork',
env: {
NODE_ENV: 'development',
},
env_production: {
NODE_ENV: 'production',
},
},
],
};
4.3 주요 옵션
name
: 애플리케이션의 이름입니다.script
: 실행할 스크립트 파일입니다.instances
: 실행할 인스턴스 수입니다. 숫자 또는'max'
로 설정할 수 있습니다.exec_mode
: 실행 모드입니다.'fork'
또는'cluster'
로 설정할 수 있습니다.env
: 기본 환경 변수입니다.env_production
: 프로덕션 환경에서 사용할 환경 변수입니다.
4.4 설정 파일로 애플리케이션 시작
pm2 start ecosystem.config.js --env production
-env
옵션으로 사용할 환경을 지정합니다.
5. PM2를 사용한 애플리케이션 관리 예제
5.1 단일 인스턴스 애플리케이션 실행
pm2 start app.js --name my-app
5.2 멀티 인스턴스 애플리케이션 실행 (클러스터 모드)
pm2 start app.js -i max --name my-app --exec_mode cluster
- 주의: 애플리케이션이 클러스터 모드에서 동작하도록 설계되었는지 확인해야 합니다.
5.3 파일 변경 시 자동 재시작
pm2 start app.js --watch
-watch
옵션은 파일 시스템의 변경을 감시하고, 변경 시 자동으로 애플리케이션을 재시작합니다.
5.4 환경 변수 설정
pm2 start app.js --name my-app --env production
- 또는
ecosystem.config.js
에서env
옵션을 사용합니다.
5.5 시작 스크립트에 인자 전달
pm2 start app.js --name my-app -- arg1 arg2
-
이후의 인자는process.argv
를 통해 애플리케이션에서 접근할 수 있습니다.
6. PM2와 로그 관리
6.1 로그 파일 위치
- 기본적으로 PM2는 로그 파일을
~/.pm2/logs/
디렉토리에 저장합니다. - 로그 파일 이름은
[프로세스 이름]-out.log
(표준 출력)와[프로세스 이름]-error.log
(에러 출력)입니다.
6.2 로그 파일 설정
ecosystem.config.js
에서 로그 파일 경로를 지정할 수 있습니다.
module.exports = {
apps: [
{
name: 'my-app',
script: 'app.js',
output: '/var/log/my-app/out.log',
error: '/var/log/my-app/error.log',
log_file: '/var/log/my-app/combined.log',
merge_logs: true,
},
],
};
output
: 표준 출력 로그 파일 경로error
: 에러 출력 로그 파일 경로log_file
: 표준 출력과 에러 출력을 결합한 로그 파일 경로merge_logs
: 여러 인스턴스의 로그를 하나의 파일로 병합할지 여부
6.3 로그 로테이션
- pm2-logrotate 모듈을 사용하여 로그 파일의 크기나 기간에 따라 로그를 회전시킬 수 있습니다.
pm2-logrotate 설치
pm2 install pm2-logrotate
설정 변경
# 로그 파일 최대 크기를 10MB로 설정
pm2 set pm2-logrotate:max_size 10M
# 로그 파일을 매일 자정에 회전
pm2 set pm2-logrotate:rotate_cron '0 0 * * *'
# 로그 파일을 14일간 보관
pm2 set pm2-logrotate:retain 14
# 압축된 로그를 사용하도록 설정
pm2 set pm2-logrotate:compress true
설정 적용 확인 및 재시작
pm2 restart pm2-logrotate
pm2 conf pm2-logrotate
7. PM2의 모니터링 및 디버깅 기능
7.1 실시간 모니터링
pm2 monit
- CPU, 메모리 사용량, 프로세스 상태 등을 실시간으로 모니터링할 수 있습니다.
7.2 프로세스 정보 조회
pm2 show [프로세스 이름 또는 ID]
- 해당 프로세스의 상세 정보를 확인할 수 있습니다.
7.3 로그 스트림
pm2 logs [프로세스 이름 또는 ID]
- 실시간으로 로그를 스트리밍하여 디버깅에 활용할 수 있습니다.
7.4 프로파일링 및 성능 분석
- PM2와 함께 Keymetrics.io와 같은 서비스나 pm2-web을 사용하여 애플리케이션의 성능을 모니터링할 수 있습니다.
8. PM2의 고급 기능
8.1 애플리케이션 재시작 정책
max_restarts
: 애플리케이션이 예기치 않게 종료되었을 때 최대 재시작 횟수를 설정합니다.restart_delay
: 재시작 사이의 지연 시간을 설정합니다.
module.exports = {
apps: [
{
name: 'my-app',
script: 'app.js',
max_restarts: 10,
restart_delay: 5000, // 5초
},
],
};
8.2 서버 재부팅 시 자동 시작
pm2 startup
- 출력된 명령어를 복사하여 실행하면 시스템 부팅 시 PM2가 자동으로 시작됩니다.
pm2 save
- 현재 실행 중인 프로세스 목록을 저장하여 재부팅 후 자동으로 복원합니다.
8.3 배포 워크플로우
- PM2는 배포 시스템을 내장하고 있어, 애플리케이션의 배포를 자동화할 수 있습니다.
배포 설정 파일 생성
pm2 deploy ecosystem.config.js production setup
배포 설정 예시
module.exports = {
apps: [
{
name: 'my-app',
script: 'app.js',
},
],
deploy: {
production: {
user: 'node',
host: 'my-server.com',
ref: 'origin/main',
repo: 'git@github.com:username/my-app.git',
path: '/var/www/my-app',
'pre-deploy': 'git reset --hard',
'post-deploy': 'npm install && pm2 reload ecosystem.config.js --env production',
},
},
};
8.4 PM2 모듈 사용
- PM2는 다양한 기능을 확장하기 위한 모듈 시스템을 지원합니다.
모듈 설치
pm2 install pm2-logrotate
모듈 목록 확인
pm2 module:list
9. 결론
PM2는 Node.js 애플리케이션의 운영 및 관리를 위한 강력한 도구입니다. PM2를 활용하면 애플리케이션의 가용성, 안정성, 확장성을 높일 수 있으며, 프로세스 관리, 로그 관리, 모니터링 등의 작업을 간소화할 수 있습니다.
주요 기능 요약:
- 프로세스 관리: 시작, 중지, 재시작, 삭제
- 자동 재시작 및 재부팅 시 자동 시작
- 클러스터 모드 지원: 멀티코어 활용
- 환경 변수 및 설정 관리
- 로그 관리 및 로그 로테이션
- 실시간 모니터링 및 디버깅
- 배포 자동화 및 모듈 시스템
PM2를 효과적으로 사용하기 위해서는 설정 파일(ecosystem.config.js
)을 잘 활용하고, 로그 및 모니터링 도구를 적극적으로 사용하여 애플리케이션의 상태를 지속적으로 파악하는 것이 중요합니다.