Evans Benedict
deVlog
Evans Benedict
전체 방문자
오늘
어제
  • * deVlog (7)
    • Daily (1)
    • Issues (0)
    • Ideas (1)
    • Coding (3)
      • JavaScript (2)
      • PHP (0)
      • C# (0)
      • Python (0)
      • Git (1)
    • Hacking (0)
    • ETC (2)
      • Databases (2)
      • Designs (0)
본 블로그는 hELLO 템플릿을 활용하여 제작되었습니다.
Evans Benedict

deVlog

pm2를 통한 NodeJS Application 관리 기법
Coding/JavaScript

pm2를 통한 NodeJS Application 관리 기법

2024. 2. 2. 15:14

자 드가자

시작하며

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/

NodeJS로 구현되어있는 Express 앱을 실행한 화면

 

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가 사용되는 대표적인 사례

  1. 실시간 통신을 필요로 하는 Web Application(채팅 앱, 게임서버, 실시간 데이터 대시보드 등)에서 서비스가 무중단으로 처리되어야 함으로 자주 사용됨.
  2. 마이크로서비스 기반의 시스템에서 각각의 서비스를 독립적인 프로세스로 관리할 때, 각각의 프로세스를 효과적으로 관리할 수 있어 자주 사용됨.
  3. 백엔드 서비스에서 여러 인스턴스로 나누어 서비스함으로써 무중단 서비스와 웹서버의 퍼포먼스를 모두 챙길 수 있어 필수적으로 사용됨.
  4. 개발 혹은 테스트 단계에서 개발자가 보다 편하게 프로세스를 관리하고 로그를 확인할 수 있도록 하여 개발 또는 테스트 단계에서의 안정성을 보장받을 수 있음.

마치며

오늘은 pm2를 통해서 NodeJS 어플리케이션을 관리하는 방법을 알아보았다.
클러스터 모드와 그에 대한 인스턴스 확장, 로드밸런싱 기능을 통해 현업에서 활용하기 위해 필수적으로 익혀야 할 내용들인것 같다.

'Coding > JavaScript' 카테고리의 다른 글

EJS 주요 문법 및 코드 스니펫 정리  (0) 2023.12.22
    'Coding/JavaScript' 카테고리의 다른 글
    • EJS 주요 문법 및 코드 스니펫 정리
    Evans Benedict
    Evans Benedict
    Hello there 👋 I'm full-stacked web engineer from South Korea. Contains daily posts, develop logs and something else.

    티스토리툴바