반응형
참고
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': ''
}
}
};
~
이 파일을 아래와 같이 수정한다.
watch를 true로 설정하면 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
반응형
'개발 > Node JS' 카테고리의 다른 글
Node JS - multer로 이미지 업로드하기 (Upload Images with multer) (0) | 2024.01.22 |
---|---|
Node JS - exec으로 Git Push 하기 (0) | 2024.01.14 |
Node JS - Express 중첩 라우팅 설정하기 (Setting Nested Routing) (1) | 2023.12.23 |
Node JS - body-parser를 이용해 데이터 전송 받기 (POST with body-parser) (0) | 2023.12.09 |
Node JS - nodemailer로 구글, 네이버, 다음 카카오 메일 보내기 (Send Emails using nodemailer to Google, Naver, Daum Kakao) (2) | 2023.12.09 |
댓글