node.js를 서버로서 백엔드에서 사용하면 고민이 생긴다.
- 서비스를 제공하고 있는 도중, 갑자기 서버가 중지된다면?
- node.js는 싱글 스레드 기반인데, 다중 스레딩을 사용하고 싶다면?
이런 고민들을 PM2를 이용해 해결할 수 있다.
PM2
node.js 어플리케이션을 쉽게 관리할 수 있게 해주는 process Manager이다. node.js 어플을 cluster mode로 실행시키거나, 메모리가 넘친다거나, 오류로 인해 프로세스가 종료되는 등의 상황에 직면했을 때,
PM2를 사용하면 간단한 설정으로 쉽게 해결할 수 있다.
pm2 설치
npm install -g pm2
글로벌로 pm2를 설치해준다.
pm2 설정파일 만들기
pm2 ecosystem
pm2의 옵션 명령어들을 파일에서 모아 관리하는 것이 유용함으로, config 파일 하나를 생성해준다.
module.exports = {
apps: [
{
script: "./src/app.ts",
name: "collect",
args: "map",
instance: 1,
exec_mode: "cluster",
out_file: "./log/log.log",
error_file: "./log/error.log",
cron_restart: "0 0-23/3 1-31 * *",
},
],
deploy: {
production: {
user: "SSH_USERNAME",
host: "SSH_HOSTMACHINE",
ref: "origin/master",
repo: "GIT_REPOSITORY",
path: "DESTINATION_PATH",
"pre-deploy-local": "",
"post-deploy":
"npm install && pm2 reload ecosystem.config.js --env production",
"pre-setup": "",
},
},
};
이렇게 config 파일을 만들어 주었으면, pm2를 실행할 때는 그냥 package.json > scripts 에서
"scripts": {
"start": "pm2 start ecosystem.config.js",
},
이렇게 만들어주고, npm run start 해주면 된다. (굳이 옵션을 구구절절 나열할 필요도 없음)
다양한 옵션 명령어들이 있지만, args와 cluster 모드로 변환 cron_restart 의 옵션이 정말 좋았다.
옵션들이 꽤나 다양해서 PM2 공식문서에 가면 간단하게 잘 설명이 나와있으니 참고하면 된다.
물론 pm2를 start할 때 옵션을 직접 넣어서 실행해주어도 되지만, config로 만드는 편이 한눈에 보기에도 좋고 자잘한 오류도 안생긴다.
https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/
pm2 공식 문서이다. 잘 나와있음.
어쨌든, 내가 유용하게 사용한 옵션은 args로 process로 가져와서 처리를 해주어야 하는 상황이었는데, 이렇게 args를 편하게 설정할 수 있다는 점. (공식 문서를 보면 env도 되는 것 같다.)
또한 초기 pm2의 설정은 fork 모드일텐데, cluster모드는 node.js의 cluster모듈을 이용해 싱글 스레드를 멀티 스레드로 구동시켜주는 것이다.
일단, 나는 서버를 만들 때 typescript를 사용하기로 했고, typescript가 호환이 가능해야 했으므로, 따로 ts-node가 있어야만 했다.
그렇기에 pm2 자체적으로 내에서 ts-node가 같이 구동되면서 실행이 되는 환경으로 만들어져야 하기 때문에 타입스크립트 연동하려면 cluster 모드는 필수였다.
이렇게 옵션으로 exec_mode : cluster를 해주면 된다.
nodemon과 같이 --watch 모드로 사용자의 코드를 계속 살펴보며 저장이 되거나, 변경사항이 있거나 할 때마다 서버가 재가동되도록 만들수도 있다.
그리고 자동화 프로그램에서 가장 중요한 것은, cron_restart 인데, 앞서 작성한 게시글에서 cron과 node_schedule 같은 배치 프로그램을 pm2에서 cron_restart 옵션만 사용하면 아주 쉽게 이용이 가능하다.
또한 log 파일도 경로를 설정해서 직접 찍혀지는 log도 확인할 수 있다.
어쨌든, 막막했던 자동화 프로그램을 한결 쉽게 만들어 준 PM2 프로세스 매니저이다.
typescript 연동
pm2와 typescript 연동하는 방법이 조금 까다롭긴 한데, (내 기준상 뭐든 typescript와 연동하는 것은 좀 까다로웠다. typescript 설치 자체도..)
우선, pm2 자체에서도 install이 가능하다.
터미널에서 pm2 install ts-node && pm2 install typescript 를 해주자.
그 후, typescript 자체가 계속 오류가 난다면 (아마 그럴것임. 암튼 난 그랬음.)
script 자체에서 postinstall로 나의 파일의 경로 자체에 typescript를 install 하겠다고 해주어야한다.
"scripts": {
"pm2": "pm2 start ecosystem.config.js",
"postinstall": "pm2 install typescript"
},
이런식으로 postinstall을 만들어 먼저 npm run postinstall을 만든 후, pm2를 작동시키면 된다.
이렇게 하면 pm2가 정상 작동 되긴했는데, 또 다른 오류가 발생할 수도 있다. 일단 난 이걸로 해결했다.
'NodeJS' 카테고리의 다른 글
node.js - node schedule / cron (스케줄 업무 자동화) (0) | 2023.02.20 |
---|---|
node.js - fs module (파일시스템 모듈) (0) | 2023.02.19 |