시작하며
pm2란?
- "PM2는 응용 프로그램을 관리하고 온라인 상태로 유지하는 데 도움이 되는 데몬 프로세스 관리자" 라고 공식 홈페이지에 나와있다.
- 데몬 (daemon)이라는 건 컴퓨터 운영체제에서 백그라운드에서 실행되는 프로세스를 말하며 따라서 pm2라는 건 NodeJS로 만들어진 어플리케이션을 관리하기 위해 사용되는 프로세스 관리자라고 말할수있다.
pm2를 사용하는 목적
- 에러가 발생하여 프로그램이 중지되는 경우 pm2가 자동으로 동작시켜주기 때문임.
- 코드를 수정할때 서버를 내릴 필요없이 코드를 저장하고 웹 새로고침만 해주면 수정내용이 반영되어 편리함.
- 로그를 가독성 좋게 한번에 볼 수 있음.
- 원래는 싱글 쓰레드인 NodeJS를 pm2 cluster 모드를 통해 원하는만큼 인스턴스를 확장하여 운용할수 있게 도와줌.
- 로드밸런서가 내장되어있어 어플리케이션을 쉽게 확장할수 있음. 이는 pm2 cluster 기능과 맞물려 운용됨.
pm2 환경을 통한 무중단 서비스의 구현
기본적인 사용방법
pm2를 사용하기 위해서는 일단 설치를 진행해야 한다.
# npm을 이용하여 설치한다.
sudo npm install -g pm2
# windows에서는 sudo를 제외한다. 대신에, cmd 쉘이 관리자 권한으로 실행되어야 함
npm install -g pm2
설치가 다 되었다면, pm2를 이용하여 일단 프로세스를 하나 실행해보자.
나는 익스프레스 프로젝트를 하나 실행해보겠다.
pm2 start ./bin/www/
Express Application을 하나 실행해 보았다. 명령어를 실행하자 pm2 daemon이 실행되며 관련 안내 문구가 출력된다.
실행된 후에는 pm2로 실행중인 프로세스의 목록이 출력되게 되는데, 이 구성을 한번 살펴보자.
pm2 start 명령시에 매개변수를 주어 설정가능한 항목은 컬럼명 옆에 *로 표시함.
이름 | 설명 |
id | pm2의 프로세스의 고유 식별자임. 프로세스 시작할때마다 자동 할당. |
name * | Application 이름. |
namespace * | Process Namespace. 서비스별로 그룹지어 구분할때 쓰는 용도임. |
version | Application의 package.json 파일에 정의된 버전. |
mode * | 'fork' 모드는 단일 인스턴스 실행 / 'cluster' 모드는 여러 인스턴스로 실행 |
pid | Process Id. 리눅스에서 ps -ef 명령어 입력시 출력되는 프로세스 번호. |
uptime | Process가 실행되어 있는 시간. |
↺ (restart) | Process가 자동으로 재시작된 횟수. |
status | Process의 현재 상태. |
cpu | Process가 사용중인 CPU의 할당량. (백분위로 표기) |
mem | Process가 사용중인 메모리(RAM)의 할당량. |
user | Process를 실행한 사용자의 이름. |
watching * | 파일이 변경되는지 감시하는 기능이 켜져있는지 여부. |
name 설정하기
pm2 start ./bin/www --name "표기할 이름"
namespace 설정하기
pm2 start ./bin/www --namespace "web1"
mode 설정하기
#기본적으로는 fork로 실행되지만, cluster모드로 실행해 보자.
pm2 start ./bin/www -i 4 #4개의 인스턴스를 cluster모드로 실행
pm2 start ./bin/www -i max #cpu 코어 수만큼 자동으로 인스턴스를 생성
watching 설정하기
#기본적인 watching 설정
pm2 start ./bin/www --watch
#특정 폴더 감시 제외
pm2 start ./bin/www --watch --ignore-watch="node_modules"
#특정 파일만 감시
pm2 start ./bin/www --watch --watch-options="['*.js']"
pm2의 장단점
장점
- NodeJS Application이 종료되거나 할 경우 자동으로 재시작함.
- 하나의 Application을 여러 인스턴스로 실행하여 로드 밸런싱이 가능함.
- 실시간으로 애플리케이션 성능과 상태를 모니터링할 수 있음.
- 콘솔 출력과 에러 로그를 파일로 저장하여 관리할 수 있음.
- Application 프로세스를 쉽게 시작, 정지, 재시작할 수 있음.
단점
- 초보자가 활용하기에 기능들이 복잡할 수 있음.
- 실시간 모니터링과 로깅으로 인해 리소스를 계속해서 사용하게 됨.
- 고급 기능을 활용하기 위한 설정이 복잡할 수 있음. (인스턴스 다중화, 로깅 설정 등)
pm2가 사용되는 대표적인 사례
- 실시간 통신을 필요로 하는 Web Application(채팅 앱, 게임서버, 실시간 데이터 대시보드 등)에서 서비스가 무중단으로 처리되어야 함으로 자주 사용됨.
- 마이크로서비스 기반의 시스템에서 각각의 서비스를 독립적인 프로세스로 관리할 때, 각각의 프로세스를 효과적으로 관리할 수 있어 자주 사용됨.
- 백엔드 서비스에서 여러 인스턴스로 나누어 서비스함으로써 무중단 서비스와 웹서버의 퍼포먼스를 모두 챙길 수 있어 필수적으로 사용됨.
- 개발 혹은 테스트 단계에서 개발자가 보다 편하게 프로세스를 관리하고 로그를 확인할 수 있도록 하여 개발 또는 테스트 단계에서의 안정성을 보장받을 수 있음.
마치며
오늘은 pm2를 통해서 NodeJS 어플리케이션을 관리하는 방법을 알아보았다.
클러스터 모드와 그에 대한 인스턴스 확장, 로드밸런싱 기능을 통해 현업에서 활용하기 위해 필수적으로 익혀야 할 내용들인것 같다.
'Coding > JavaScript' 카테고리의 다른 글
EJS 주요 문법 및 코드 스니펫 정리 (0) | 2023.12.22 |
---|