PM2 — Node.js 서버를 더 쉽게 관리하기 — 2

Harry The Great
해리의 유목코딩
6 min readNov 28, 2018

1편에 이어지는 내용입니다. 1편 내용이 너무…. 베이직한 내용이라 파라미터와 옵션중심 그리고 Deploy 중심으로 이어나가겠습니다.

start 명령어

# app.js에 -a 23이라는 인수를 전달
$ pm2 start app.js -- -a 23
# 프로세스 이름을 지정
$ pm2 start app.js -- name servername
# --node-args를 통해 node v8에 옵션값을 전달
$ pm2 start app.js --node-args="--debug=7001"
# cpu를 최대치로 할당(클러스터 전용)
$ pm2 start app.js -i max
# 로그의 시간데이터 포맷을 지정
$ pm2 start app.js --log-date-format "YYYY-MM-DD HH:mm Z"
# 아웃풋 로그와 에러로그의 위치를 지정
$ pm2 start app.js -e err.log -o out.log
# 명령어를 pm2를 실행하는 유저가 아닌 harry로 설정
# 유저그룹은 --run-as-group
$ pm2 --run-as-user harry start app.js

실제 운영버전에서는 이런 옵션값의 경우 JSON파일로 관리하는편이 좋습니다.

JSON 파일의 예시

{
"apps" : [{
"name" : "worker",
"script" : "./worker.js",
"watch" : true,
"env": {
"NODE_ENV": "development"
},
"env_production" : {
"NODE_ENV": "production"
}
},{
"name" : "api-app",
"script" : "./api.js",
"instances" : 4,
"exec_mode" : "cluster"
}]
}

JSON파일을 살펴볼경우 apps를 통해 실행할 프로세스들을 정의하였습니다. name을통해 이름 script를통해 파일등의 옵션값을 주었고 watch에대해 자세한 설정을 하고싶다면 아래와같이 추가하여줍니다.

{
"watch": ["server", "client"],
"ignore_watch" : ["node_modules", "client/img"],
"watch_options": {
"followSymlinks": false
}
}

JSON파일을 통한 옵션설정은 상당히 많은 부분들을 지원합니다 예를들어

  • listen_timeout — 앱의 응답이 없을경우 재시작할 시간
  • min_uptime — 일정시간 이후 재시작을 원할경우
  • max_restarts — 재시작 최대횟수
  • restart_delay — 재시작 딜레이
  • cron_restart — cron을통핸 재시작

JSON 파일의 자세한 옵션은 이곳에서 확인하실 수 있습니다.

$ pm2 start   config.js 
$ pm2 restart config.js # 정의된 프로세스 재시작
$ pm2 reload config.js # 정의된 프로세스 설정 다시 불러오기
$ pm2 delete config.js # 정의된 프로세스 삭제

이렇게 설정된 config.js파일의 경우 위와같이 실행할 수 있습니다.

프로세스 관리

$ pm2 stop all # 모든 프로세스 멈추기
$ pm2 restart all # 모든 프로세스 재시작
$ pm2 reload all # 모든 프로세스의 다운타임을 0으로 설정후 다시로드
$ pm2 stop 0 # 프로세스 0번을 멈추기
$ pm2 restart 0 # 프로세스 0번을 재시작
$ pm2 delete 0 # 프로세스 0번을 삭제
$ pm2 delete all # 프로세스 전부 삭제
$ pm2 ping # pm2가 사용가능한지 핑확인
$ pm2 updatePM #pm2 업데이트
$ pm2 reset <process> # 리셋 후 메타데이터 리로드

로그관리

$ pm2 logs #모든 로그 출력
$ pm2 ilogs #자세한 로그 출력
$ pm2 flush #모든 로그 비우기
$ pm2 reloadLogs #로그 다시불러오기

Deploy

Deploy에 대한 내용도 설정파일에서 가능합니다. 기존의 json파일에서 apps 이외에 deploy값을 주어 상세설정을 할 수 있습니다.

{
"apps" : [{
"name" : "HTTP-API",
"script" : "http.js"
}],
"deploy" : {
"production" : {
"user" : "ubuntu",
"host" : ["192.168.0.13"],
"ref" : "origin/master",
"repo" : "git@github.com:Username/repository.git",
"path" : "/var/www/my-repository",
"post-deploy" : "npm install; grunt dist"
},
}
}

위의 파일과같이 deploy에 production 설정값을준후(이름은 dev, prod 원하는대로 설정합니다.) 위와같이 설정을한다면 서버에 Deploy 명령을 줄때마다 깃 Repository에서 자동으로 땡겨와 npm install을 한 후 설정값에따라 node프로세스 를 실행합니다.

#Production에 설정된값에따라 Git에서 코드를 받아 세팅합니다.$ pm2 deploy production setup

# 이미 setup을 한경우 update를 통해 새로운 버전을 받습니다.
$ pm2 deploy production update

# 이전 버전으로 Revert 시키는명령어로 setup을통해 deploy한경우 폴더를 열어보면
# 전에 받았던 node 서버들의 형상을 가지고있어 바로 복구가 가능합니다.
$ pm2 deploy production revert 1

# deploy를 한 후의 추가적인 명령어를 파라미터로 줄 수 있습니다.
$ pm2 deploy production exec "pm2 reload all"

위 예시에는 post-deploy만 기술했지만 pre-setup,post-setup ,post-deploy-local등을 통해 많은 이벤트 파라미터를 줄 수 있습니다. 자세한 파라미터는 역시 도큐먼트입니다! (파라미터가 너무 많아서…. 다 설명드리기가힘드네요…)

마치며

pm2를 개발환경에서 사용하기에는 아주 좋은 툴입니다. 하지만 deploy부분을 보시면 아시겠지만 큰 서비스에 효율적으로 대처하기는 어렵습니다. 예를들어 서버의 오토스케일링이 자주일어난다거나 혹은 블루그린배포를 해야한다거나… 때문에 도커라이징된 pm2를 이용하면 서버배포와 관리를 더 효율적으로 할 수 있습니다.

--

--

Harry The Great
해리의 유목코딩

Android & IOS Developer 😀 미디움 이외에 스니펫이나 디버그노트로 활용하는 https://www.harrymikoshi.com/ 블로그도 운영하고있습니다.