본문 바로가기
Back-End/node.js

node.js pm2 패키지 매니저 사용 방법

by blackjack_96 2022. 2. 23.

node.js에서 자주 사용되는 pm2 패키지 매니저의 이용 방법

 

pm2란 node.js로 구동되는 javascript 애플리케이션을

손쉽고 효율적으로 운용할 수 있도록

도와주는 소프트웨어 입니다.

 

 

pm2가 node.js로 구동되는 애플리케이션을

어떠한 방식으로 도와주는지 구체적으로 알아보겠습니다.

 

 

먼저 저는 main.js라는 javascript로 작성된 웹 서버 프로그램을 준비했습니다.

 

 

1. 먼저 일반적인 방식으로 앱을 실행시켜 봅시다

 

먼저 다음과 같이 우리가 알고 있는 일반적인 방식으로 

앱을 실행시켜 봅시다.

자, 웹 서버를 드디어 구동시켰습니다.

 

 

그런데 문제가 발생했습니다.

웹 서버를 위와 같이 실행시키고, 구동중인데

웹 서버의 작동이 생각한 것과 달라서 소스코드를 보니깐

잘못 작성된 소스코드가 보여 이를 수정하였고, 저장하였습니다.

 

그럼 한가지 질문하겠습니다.

제가 방금, 실행중인 앱 애플리케이션의 소스코드를 수정하였는데,

지금 구동중인 웹 서버에 이 수정사항이 반영될까요?

답은 NO입니다.

 

 

제가 수정한 소스코드가 반영되기 위해서는

위에서 실행중인 웹 애플리케이션을 종료하고,

다시 시작해야만 합니다.

 

 

그러면 이렇게 생각해 봅시다.

 

 

지금 제가 웹 서버를 프로그래밍 하였고, 디버깅하는 단계에 있습니다.

이런 저런 테스트를 하면서 수시로 소스코드를 고쳐가면서

웹 서버가 잘 동작하는지 테스트 해야만 합니다.

그러면 소스코드가 수정된 것이 또 잘 작동하는지 확인을 하기 위해서,

 

다시 서버를 재시작하고,

또 소스코드를 고쳤다가 다시 서버를 재시작하고,

...

 

 

한다면 매우 불편할 것입니다.

 

 

이런 때 pm2가 해결책을 제시해 줄 수 있습니다

 

2. 서버를 pm2로 실행해 봅시다.

 

 

 

main.js라는 서버 앱을 pm2라는 모듈을 이용해 실행하는 명령어 입니다.

이렇게 실행하고 나면 어떤 일이 발생하는지 봅시다.

 

 

 

 

pm2를 이용하여 앱을 실행하였더니,

PM2에서 애플리케이션을 Daemonized했다는 문구가 출력됩니다.

이는 pm2가 node.js 애플리케이션을 성공적으로,

Foreground가 아닌 Background로 실행시켰다는 이야기 입니다.

(프롬프트에서 또 사용자의 명령을 기다리고 있는게 보이시죠?)

 

 

이와 같이 pm2는 node.js 애플리케이션을 Foreground가 아닌

Background로 실행시킵니다.

 

 

그리고 맨 뒤에 잘 보면 --watch 옵션이 있습니다.

이 옵션이 제가 1번에서 설명했었던 문제를 직접적으로 해결해주는 옵션입니다.

 

 

말 그래도 pm2가 실행중인 애플리케이션을 항상 뜬눈으로 감시하고 있다가(Watch : 당직 또는 감시하고있다는 의미)

만약 애플리케이션의 소스코드나, 기타 사항이 변경된다면

자동으로 애플리케이션을 종료하고 다시 실행시킴으로써

수정된 사항이 즉각 반영되도록 도와줍니다.

 

3. pm2로 동작중인 app프로세스의 목록 확인하기

 

위와 같이 명령어를 입력하면 pm2로 구동중인 프로세스들의 목록을 출력해 줍니다.

 

4. pm2로 동작중인 프로세스 모두 종료하기

위와 같이 명령어를 입력하면 pm2로 구동중인 프로세스들을 모두 정상 종료시켜 줍니다.

 

 

5. --no-daemon옵션

 

daemon이란 기본적으로 background와 의미가 같습니다.

 

 

아까 pm2는 기본적으로 node.js애플리케이션을

background로 실행시켜준다고 말씀 드렸죠? 

그렇지만 위와 같이 no-daemon옵션을 설정해 주면

해당 애플리케이션이 foreground로 실행이 됩니다.

 

 

자세히 보시면, 아까 --no-daemon옵션을 설정하여 실행한 프로그램의 경우는

명령어를 실행하고 나서

곧바로 또 사용자의 입력을 받는 상태가 되었지만,

 

 

이번 --no-daemon옵션을 주어 실행하였을 때에는

사용자의 입력을 받는 상태가 아닙니다.

 

 

이 app이 foreground로 실행이 되었기 때문입니다.

 

 

만약 main.js 소스코드 중

이러한 코드가 있다고 해봅시다.

console.log("Server Started!")

만약 Background로 실행된 애플리케이션의 경우는

우리가 보고있는 콘솔에 Server Started!라는 메시지가 출력되지 않습니다.

 

왜냐하면,

우리가 바라보고 있는 console에서 실행되는 것이 아니라

console 뒤쪽에서

백그라운드로 실행이 되고 있기 때문이죠,

 

 

하지만 Foreground로 실행이 되는 애플리케이션의 경우는

저 위의 코드를 만나자 마자

Server Started!라는 메시지를 콘솔에 출력해 줍니다.

 

 

왜냐하면 우리가 바라보고 있는 console상에서 실행되고 있는 애플리케이션이기 때문입니다.

 

이러한 이유 때문에,

디버깅 등의 목적을 위해 자바스크립트의 console.log()함수를 통하여

메시지를 콘솔에 출력하고 싶다면

--no-daemon옵션을 주며 실행하는 것입니다.

 

6. --ignore-watch 옵션

실행시키고 있는 웹 서버에 다음과 같은 기능이 있다고 해 봅시다.

 

 

"클라이언트가 어떠한 메시지를 입력하면

그 메시지가 서버로 전달이 되서, 서버측 컴퓨터의 /data라는 Directory에 파일로 저장이 된다."

 

 

자, 접속자가 메시지를 입력하고 클릭하였습니다.

서버측으로 그 메시지가 전달되고,

서버측의 컴퓨터에 파일로 저장이 되었습니다.

 

 

그러면 어떤 일이 일어날까요??

 

 

힌트는 아까 설명했던 --watch 옵션입니다.

 

 

--watch옵션을 주어서 실행된 경우,

현재 실행중인 애플리케이션에 변화가 일어났는지를 감시하고 있다가,

변화가 발생하면 해당 애플리케이션을 자동으로 다시 시작해준다고 했죠?

 

 

그러면 사용자가 메시지를 입력하고 클릭할 때마다,

그 메시지가 서버의 특정 디렉터리에 저장이 되고, 그러면

pm2는 app에서 이용하고 있는 디렉토리에 변화가 일어났음을 감지하게 되겠죠?

그러면 여지없이 그 app을 껐다가 다시 시작하게 될겁니다.

 

 

이게 바람직한 현상일까요? -> 아닙니다!

 

 

프로그래머가 의도하지 않은 순간에 앱의 재시작이 이루어지고 있습니다.

그러면 세션변수 등 중요한 변수들의 정보까지 모두 초기화가 이루어지기 때문에,

오작동을 야기할 수 있습니다.

 

 

이럴 때는 이러한 방법을 씁니다.

 

pm2 start main.js --watch --ignore-watch="data/*" --no-daemon

 

만약 어떠한 변화가 발생된 경우 그 앱을 재 시작해 주어라,

하지만 그러한 변화가 "data"라는 디렉토리에서 감지된 것이라면, 무시하여라(ignore)

 

 

이러한 방식으로 --ignore-watch 옵션을 이용하여 조건을 부여함으로써

프로그래머가 의도하지 않은 시점에 재시작이 발생하여

소중한 정보가 소실되는 것들을 방지할 수가 있습니다.

 

 

이상 pm2의 사용방법에 대하여 알아보았습니다.

감사합니다.