Node.js 어플리케이션을 쉽게 관리할 수 있게 해주는 Process Manager 로, 멀티 프로세스 (Worker) 구현, 무중단 서비스 등등 다양한 기능들을 편리하게 사용할 수 있도록 제공하는 것(?) 이다.
가장 큰 이유는 API server 를 배포할때마다 서버를 재시작해야 하는데, 이때 서비스가 중단되지 않도록, 즉 무중단 서비스를 구현하고 싶어서 한번 써보려 한다.
구글에 pm2 라고 치면 검색 결과가 굉장히 많이 나온다.
npm 혹은 yarn 으로 글로벌로 설치한다. 글로벌로 설치해야 pm2 명령어를 사용 가능하다.
난 yarn 으로 설치했다.
yarn global add pm2
설치끝이다. 현재 pm2 버전은 아래와 같다.
이제 pm2 설정 js 파일을 만들고, node 명령어 대신 pm2 명령어로 실행하면 된다.
pm2 init
명령어를 치면 자동으로 ecosystem.config.js 파일이 생성된다.
본인의 설정 혹은 취향대로 수정하면 된다.
참고로 난 npm 대신 yarn 으로 수정했고, 기존 App.js 파일의 이름을 index.js 로 바꿨다.
$ pm2 init
// ecosystem.config.js
module.exports = {
apps : [{
script: 'index.js',
watch: '.'
}],
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': ''
}
}
};
이제 pm2 start
명령어로 실행해주면 된다.
$ pm2 start
근데 바로 에러 발생 ㅋㅋㅋㅋ
pm2 는 esm script 를 지원하지 않는다. 근데 내 프로젝트는 esm script 사용...
뭐 에러 문구에 나온대로 ecosystem.config 파일의 확장자를 cjs 로 변경하고, 아래 명령어를 다시 쳐 봤다.
$ pm2 start ecosystem.config.cjs
결과는? 성공!! 정상적으로 서버 실행되었당.
.yml 파일을 수정해서 배포가 완료될때 서버 재시작을 해보자.
방법은 간단하다. 어제 작성한 api-server-deploy.yml 파일 하단에 pm2 reload 하는 구문을 추가한다.
name: api-server-deploy
on:
push:
branches: [ master ]
jobs:
api-server-deploy:
runs-on: self-hosted
steps:
- uses: actions/checkout@v2
- name: remove
run: rm -rf /home/opc/api-server/*
- name: cp
run: cp -r ./* /home/opc/api-server/
- name: yarn install
run: yarn install
working-directory: /home/opc/api-server/
- name: pm2 reload
run: pm2 reload ecosystem.config.cjs
working-directory: /home/opc/api-server/
결과는?? 성공!!! 이제 신나게 api 서버 개발하면 될듯... 아이 신나...