- 전체
- HTML
- Web Design (웹디자인)
- XE 응용 개발
- wordpress plugin dev
- Javascript & JavaScript Application
- MEAN Stack : full stack javascript
- angular js & ionic framework
- bootstrap
- WebGL, Three.js and Babylon.js
- restful api design
- mobile web
- node.js 응용
- Cloud Service 응용
- 웹 어셈블리 개발 [WASM, WebAssembly]
- 마이크로서비스, MSA (microservice architecture)
- WebGL / WebGPU
- next.js 개발
- micro frontend (마이크로프론트앤드)
node.js 응용 [node.js 응용] PM2 - Node.js 프로세스 관리 도구
2021.12.10 00:04
[node.js 응용] PM2 - Node.js 프로세스 관리 도구
서버에서 웹 애플리케이션을 운영할 때 보통 데몬으로 서버를 띄워야 하고 Node.js의 경우 서버가 크래시나면 재시작을 하기 위해서 워치독(watchdog) 류의 프로세스 관리자를 사용하게 된다. 나 같은 경우 아주 초기에는 Upstart와 Monit을 사용했고 이후에는 Node.js 전용으로 나온 forever라는 도구를 사용했다. 지금은 프로세스 관리 도구로 PM2로 갈아탄 지 2년 가까이 되었는데 이에 대해 따로 글은 안 쓰고 있다가 지난달에 1.0이 나와서 새기능을 정리도 할 겸 글을 남긴다.
PM2 기본 사용방법
pm2 명령어를 사용해야 하므로 npm을 이용해서 전역으로 설치한다.
Node.js 애플리케이션의 실행 파일이 app.js
라고 했을 때 다음과 같이 pm2 start
명령어로 앱을 실행한다. pm2를 쓰지 않는다면 node app.js
가 될 것이다.
앱의 이름을 지정하지 않으면 실행한 파일명이 된다. 명확한 이름을 지정하고 싶다면 --name
옵션을 사용한다.
forever를 쓴지 오래돼서 그사이에 얼마나 달라졌는지는 잘 모르지만 실행된 프로세스 목록을 forever보다 훨씬 깔끔한 표로 보여주어서 보기가 쉽다. 이 목록에서 현재 프로세스의 상태와 몇 번 재시작 되었는지 실행한 지 얼마나 되었는지를 파악할 수 있다. pm2로 애플리케이션을 실행하면 자동으로 애플리케이션을 데몬으로 실행하고 stdout/stderr로 출력된 메시지도 로그파일에 쌓아준다.
실행된 프로세스 목록을 보고 싶다면 pm2 list
를 사용한다.
만약 해당 애플리케이션이 Git으로 관리되고 있다면(다른 형상관리도구로 테스트는 해보지 않았다.) pm2 show
명령어를 사용할 때 다음과 같이 리비전 정보가 함께 나온다. 이는 서버에서 현재 실행된 애플리케이션이 어떤 소스를 기반으로 실행되어 있는지 확인할 때 유용하다.
애플리케이션을 새로 배포하거나 해서 애플리케이션을 재시작 하려면 pm2 restart <id|name>
명령어를 사용한다.
애플리케이션을 멈추려면 pm2 stop <id|name>
명령어를 사용한다.
pm2에 많은 기능이 있지만 2년 정도 전에 pm2로 갈아탄 이유 중 하나가 멈춘 프로세스도 pm2가 관리해 준다는 것이다. forever의 경우 특별한 이유로 잠시 앱을 멈추려면 목록에서 사라지기 때문에 다시 실행하려고 할 때 기존의 옵션 등을 찾아야 했지만 pm2는 멈춘 프로세스도 관리하에 있으므로 필요할 때 바로 실행할 수 있고 운영하는 중에는 중단해 놓은 프로세스 목록을 확인하는 것도 중요하다.
프로세스 목록에서 제거하려면 pm2 delete <id|name>
명령어를 사용하고 pm2 데몬 자체를 죽이려면 pm2 kill
명령어를 사용한다.
로그파일 확인
애플리케이션 서버를 실행하면 디버깅도 해야 하고 운영도 해야 하므로 로그파일을 확인해야 한다. 위에서 각 프로세스의 상태를 확인했을 때 보았듯이 pm2가 로그파일을 직접 관리해 주므로 이 파일을 tail
등의 명령어로 확인하면 로그를 확인할 수 있다.
pm2 logs
혹은 특정 프로세스의 로그만 보고 싶다면 pm2 logs <id|name>
을 실행하면 마지막 로그내용과 함께 이후 출력되는 로그 내용을 화면에 뿌려주게 되므로 파일을 일일이 찾을 필요없이 쉽게 로그내용을 확인할 수 있다. 로그파일을 지우려면 pm2 flush
를 실행하면 된다.
클러스터 모드
Node.js에도 클러스터 모듈이 존재하지만, PM2를 이용하면 CPU를 최대한 활용할 수 있도록 클러스터 모드로 실행할 수 있다.
인스턴스를 실행할 때 -i
옵션을 사용하면 클러스터 모드로 실행되고 -i
뒤에는 실행할 인스턴스의 개수를 지정하면 된다. 여기서 0
을 지정하면 사용 가능한 CPU 개수만큼 실행이 된다. 앞에 실행과 비교해 보면 mode
가 fork
가 아니라 cluster
로 표시됨을 알 수 있다. 애플리케이션 서버가 무상태(stateless)라면 다른 수정 없이 바로 클러스터 모드를 사용할 수 있고 자동으로 로드 밸런싱이 된다. 나는 노드의 클러스터 모듈 대신 서버 내에 인스턴스를 여러 개 띄우는 걸 선호하기 때문에 이 방법은 무척 편리하다.
클러스터 모드를 사용할 때 pm2 restart <id|name>
대신 pm2 reload <id|name>
를 사용하면 다운타임 없이 서버를 재기동할 수 있다. 단 클러스터 모드는 Node.js v0.10에서는 지원하지 않는다.
JSON 설정 파일
앞에서는 명령어로 서버를 실행했지만 실행할 인스턴스의 설정을 JSON 파일로 관리할 수 있다. JSON 파일로 관리하면 좋은 점은 어떤 서버나 환경에서도 같은 설정을 사용해서 서버를 실행할 수 있다는 점이다. 앞에서는 간단한 옵션만을 사용했지만, PM2의 제공하는 수많은 옵션을 모두 JSON으로 관리할 수 있다.
다음과 같은 ecosystem.json
이 있다고 해보자.
pm2로 실행할 때 이 JSON 파일로 실행하면 지정한 설정으로 서버를 실행할 수 있다.
모니터링
PM2에서는 자체적으로 모니터링 기능도 제공하고 있다. pm2 monit
을 실행하면 터미널에서 다음과 같은 모니터링 대시보드를 볼 수 있다. 서버 배포 후나 테스트를 할 때 서버의 부하를 확인하는 용도로 좋다.
[출처] https://blog.outsider.ne.kr/1197
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.