본문 바로가기
개발/Node JS

Node JS - PM2 ecosystem.config.js로 환경 변수 설정하기

by 피로물든딸기 2023. 12. 25.
반응형

Node JS 전체 링크

 

참고

- 인증 토큰 획득 서버 구현하기

 

pm2로 프로세스를 관리할 때, dotenv로 환경 변수를 적용하더라도 잘 반영되지 않는 경우가 있다.

pm2의 ecosystem을 이용해서 환경 변수를 설정해 보자.

 

pm2를 전역으로 설치한다.

npm install pm2 -g

 

정상적으로 설치가 되었다면 version을 확인해 보자.

$ pm2 -version
5.3.0

 

pm2 start [Node App 진입점](여기서는 server.js) 으로 백그라운드로 App을 실행할 수 있다.

$ pm2 start server.js
[PM2] Starting D:\github\node-server\server.js in fork_mode (1 instance)
[PM2] Done.
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0  │ server             │ fork     │ 0    │ online    │ 17.2%    │ 40.6mb   │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
[PM2][WARN] Current process list is not synchronized with saved list. Type 'pm2 save' to synchronize

 

현재 구동 중인 App의 목록은 pm2 list로 알 수 있다.

$ pm2 list
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0  │ server             │ fork     │ 0    │ online    │ 0%       │ 44.0mb   │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
[PM2][WARN] Current process list is not synchronized with saved list. Type 'pm2 save' to synchronize

 

이제 pm2 ecosystem 명령어로 config 파일을 만들자.

$ pm2 ecosystem
File D:\github\node-server\ecosystem.config.js generated

$ ls
ecosystem.config.js  log/    node_modules/  package-lock.json  server.js
library/             macro/  package.json   routes/

 

예시로 주어지는 파일은 다음과 같다.

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

 

이 파일을 아래와 같이 수정한다.

watchtrue로 설정하면 nodemon을 사용하지 않아도 파일이 변경되면 즉시 재구동된다.

module.exports = {
  apps: [
    {
      name: 'my_node_server',
      script: 'server.js', // 애플리케이션의 진입점 파일명
      instances: 1, // 실행할 프로세스의 인스턴스 수
      autorestart: true, // 애플리케이션의 자동 재시작 여부
      watch: true, // 파일 변경 감지 및 재시작 여부
      max_memory_restart: '1G', // 메모리 사용량을 기준으로 재시작하는 설정

      env: { // 환경 변수
        TOKEN: 'token',
        PASSWORD: 'password'
      }
    },
  ],
};

 

pm2 start ecosystem.config.js --env production으로 pm2를 실행하면 환경 변수가 적용된다.

또한 name으로 설정한 대로 pm2가 실행되었다.

$ pm2 start ecosystem.config.js --env production
[PM2][WARN] Applications my_node_server not running, starting...
[PM2][WARN] Environment [production] is not defined in process file
[PM2] App [my_node_server] launched (1 instances)
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0  │ my_node_server     │ cluster  │ 0    │ online    │ 37.4%    │ 52.4mb   │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
[PM2][WARN] Current process list is not synchronized with saved list. Type 'pm2 save' to synchronize

 

환경 변수는 dotenv와 마찬가지로 process.env로 접근할 수 있다.

router.get("/test", (req, res) => {
  res.send({
    token: process.env.TOKEN,
    password: process.env.PASSWORD,
  });
});

 

그리고 pm2 save 명령어로 재구동 후에도 프로세스가 계속 실행되도록 설정한다.

$ pm2 save
[PM2] Saving current process list...
[PM2] Successfully saved in C:\Users\myid\.pm2\dump.pm2

 

마지막으로 불필요한 app은 pm2 delete [App Name]으로 실행을 종료한다.

$ pm2 delete my_node_server
[PM2] Applying action deleteProcessId on app [my_node_server](ids: [ 0 ])
[PM2] [my_node_server](0) ✓
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

만약 pm2 start ~ 명령어를 매번 입력하기 귀찮다면, package.json에 scripts를 추가하면 된다.

  "scripts": {
    "start": "pm2 start ecosystem.config.js --env production"
  }

 

이제 npm start로 위의 명령어를 실행할 수 있다.

npm start
반응형

댓글