PM2 적용

손대중·2022년 3월 17일
0
post-thumbnail

PM2 란?

Node.js 어플리케이션을 쉽게 관리할 수 있게 해주는 Process Manager 로, 멀티 프로세스 (Worker) 구현, 무중단 서비스 등등 다양한 기능들을 편리하게 사용할 수 있도록 제공하는 것(?) 이다.

나는 왜 PM2 를 쓰려고 하나??

가장 큰 이유는 API server 를 배포할때마다 서버를 재시작해야 하는데, 이때 서비스가 중단되지 않도록, 즉 무중단 서비스를 구현하고 싶어서 한번 써보려 한다.

내가 참조한 링크들

구글에 pm2 라고 치면 검색 결과가 굉장히 많이 나온다.

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

결과는? 성공!! 정상적으로 서버 실행되었당.

GitHub Actions 와 연동 (.yml 파일 수정)

.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 서버 개발하면 될듯... 아이 신나...

0개의 댓글