Nest.js EC2 PM2 환경변수 에러

김민호·2022년 9월 30일
1

Dev-Ops

목록 보기
2/2

Node.js에선 pm2 start app.js나 www.js등 서버 실행 코드가 있는 script파일을 실행하면
무난하게 pm2를 사용할 수 있다.

하지만 Nest.js를 사용하여 코드를 작성하고 EC2에 업로드 후 pm2를 사용하려 한다면
방법이 다르다.

Node.js에서 하던대로 pm2 start를 하면 에러가 발생한다.

EC2 ubuntu 환경에서 작업을 진행했기에 sudo 명령어를 사용했다.

혹시나 해서 dist 폴더의 main.js를 PM2로 실행하면 실행은 된다.


pm2 log 찍어보면 DB에 접근도 못하고있다. vscode환경에서 작업할 땐 .env파일에 있는 내용들을 잘 읽어왔는데 EC2의 ubuntu 환경에선 읽지 못하는 모습이다.

당연히 postman으로 요청을 보내도 닿지 않는다.

일단 방법을 설명하기에 앞서 project 폴더에 있는 dist폴더에 대해 알아야한다.

🎈dist 폴더

src의 typescript 코드들이 Node.js에서 작동하기 위해 javascript 코드로 컴파일된 결과물들이 모여있는 폴더이다. 그래서 src폴더에서 entity 변수명이 아닌 파일명을 변경하거나, 추가, 삭제를 해도 dist폴더에 전 작업들의 잔재가 남아있어 db에서 테이블이 2개 씩 생기는 오류들이 발생하기도 한다.

그래서 dist폴더를 들어가면 main.js파일이 있다.
이것이 우리가 pm2로 실행해야 하는 파일이다.

🎈pm2 ecosystem

PM2 설정파일을 생성하기 위한 명령어이다.
나는 EC2에 코드를 올려놓기 위해서 Git bash로 원격 접속을 해 ubuntu 환경에서 작업을 진행했다.

pm2 ecosystem


사진과 같이 ecosystem.config.js 라는 파일이 생성되었다.

module.exports = {
  apps : [{
    script: 'index.js',
    watch: '.'
  }, {
    script: './service-worker/',
    watch: ['./service-worker']
  }],

  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': ''
    }
  }
};

파일의 기본 내용들이다. 우리가 집중해야 할 곳은 apps : [{ }]부분이다.
아래에 있는 deploy는 배포할 때 수정하는 곳으로 그냥 냅두자.

apps를 들여다 보면 scrpit,watch 두 개의 옵션이 있다. 그리고 추가 객체가 있다.
객체 하나가 하나의 pm2 process이다. 난 클러스터 모드를 사용하지 않을 예정이기 때문에
뒤의 객체를 지우고 env의 내용을 입력해 준다.

해당 모습과 같이 작성한 후

sudo pm2 start ecosystem.config.js

입력하면 정상적으로 실행되고 Git bash를 종료해도 postman으로 정상적으로 요청이 들어간다.

0개의 댓글