Medium - Running PM2 & Node.js in Production Environments

원문 - Nick Parsons

Trend 파악을 Medium 기고문 요약 포스팅 - 프러덕션 환경에서 Node.js와 PM2 실행하기

https://getstream.io/try-the-api

Stream에서 저희는 많은 쇼케이스와 예제 응용프로그램을 구축했고 이를 통해 우리 서비스가 제공해야 하는 멋진 피처들을 보여드렸습니다. 거의 모든 저희의 응용프로그램들은 인스턴스로써 저희가 관리하고 있습니다. 주로 AWS나 DigitalOcean을 쓰고 있습니다.

적절한 유지보수 작업은 어려운 일이죠, 저희에게 가장 힘든 도전은 계속해서 살아있고 돌아야 하는 응용프로그램을 유지보수 하는 것이었습니다. 추가적으로 Node.js는 우리의 백엔드 API의 핵심 언어로서 단일 스레드 프로세스로 이런 것을 하기에는 힘들었습니다. 이런부분에 PM2가 도움이 되었고 우리가 즐겁게 사용할 수 있엇던 이유입니다.

이미 많은 프로세스 매니저들이 있고 특히나 Forever, StrongLoop’s Process Manager, good ol’SystemD 같은 것이 유명합니다. 그리고 PM가 있는데 6천만번의 다운로드와 2만5천개의 깃허브 별을 받았습니다 (게다가 늘어나고 있죠!). 저희가 PM2를 좋아하는 이유는 간단하게 말하자면 프로덕션 환경을 매끄럽게 관리하는 데 쉽게 사용할 수 있기 때문입니다.

What is PM2?

PM2는 경쟁테스트 되고 프로덕션 준비 런타임이며 Node.js 응용프로그램들의 프로세스 매니저 입니다. 내장 로드밸런서와 함께 응용프로그램 확장도 쉽게 할 수 있습니다. 무엇보다 좋은 점은 리눅스와 윈도우즈 그리고 맥에서 동작합니다.

설정 파일(process.json)에서 여러분은 어떤 프로세스를 실행할 지, 얼마나 스케일 할지 지정할 수 있습니다. PM2로 시작을 하면 여러분이 지정한 process.json 파일대로 PM2가 나머지를 관리할 것입니다.

이 말의 의미는 PM2가 여러분의 Node.js 프로그램을 영원히 동작하도록 만들어 준다는 것이며 서버나 응용프로그램을 업데이트 할 때도 다운타임 없이 리로드할 수 있습니다.

Installing PM2

PM2를 설치하는 것은 매우 쉽습니다. 먼저 여러분은 process.json 파일이 준비가 되었는지 확인하고 싶을 겁니다. 그래야 프로세스를 시작할 수 있으니까요, 만약 여러분이 맥에서 작업을 한다면 yarn add global pm2를 실행하면 됩니다. 리눅스나 윈도우나 도커 컨테이너를 사용하고 있다면 여기를 클릭하세요

먼약 어떻게 생겼는지 궁금하시다면 저희의 RSS & Podcast 응용프로그램의 process_prod.json 파일의 예제를 보여드리겠습니다.

{
	"apps": [
		{
			"name": "api",
			"cwd": "api/dist",
			"script": "server.js",
			"watch": false
		},
		{
			"name": "conductor",
			"cwd": "api/dist/workers",
			"script": "conductor.js",
			"watch": false
		},
		{
			"name": "rss-worker",
			"cwd": "api/dist/workers",
			"script": "rss.js",
			"instances": 2,
			"exec_mode": "cluster",
			"watch": false
		},
		{
			"name": "podcast-worker",
			"cwd": "api/dist/workers",
			"script": "podcast.js",
			"instances": 2,
			"exec_mode": "cluster",
			"watch": false
		},
		{
			"name": "og-worker",
			"cwd": "api/dist/workers",
			"script": "og.js",
			"instances": 2,
			"exec_mode": "cluster",
			"watch": false
		}
	]
}

위에서 보이듯이 여러개의 프로세스를 실행하고 있고 PM2는 걔네들을 아무런 문제없이 자동적으로 Node.js 클러스터 API를 이용해 다수의 프로세스를 생성합니다.

Tips & Tricks

어떤 응용프로그램이라도 전에 사용해본적 있는 사람들에게 개인적으로 팁을 얻는 것은 유용합니다.

Auto Restart

한번 실행되면 여러분의 앱은 영원히 돌아갑니다. 크래시나 머신 재시작시에 자동으로 서비스가 돌아갑니다. 이 모든 것은 하나의 명령어로 실행됩니다. pm2 startup

Process Management

여러분이 응용프로그램 몇개나 돌리고 있던 PM2는 그들의 대표적인 상태로 관리할 수 있게 해주는 명령어들을 가지고 있습니다. 아래는 자주 사용하는 명령어 들입니다.

  • pm2 start process_prod.json - process JSON 파일로 프로세스들을 실행
  • pm2 ls - 모든 응용프로그램들의 리스트를 보여줌
  • pm2 stop - 특정 응용프로그램을 멈춤
  • pm2 start - 특정 응용프로그램을 실행
  • pm2 scale N - 응용프로그램을 여러분이 지정한 N개의 인스턴스로 확장함 (스케일 업/다운에 사용)
  • pm2 kill - 실행 중인 응용프로그램을 죽임
  • pm2 restart - 모든 응용프로그램을 재시작합니다
  • pm2 reload - 앱 설정을 리로드합니다 (이것은 앱의 환경 변수를 수정할 때 유용합니다)

Process Monitoring

pm2 monit명령어는 여러분의 응용프로그램의 상태에 대한 풍부한 데이터를 제공합니다. 예를들어 CPU 사용량, 메모리 사용량, 분당 리퀘스트 수 들을 알 수 있습니다.

Log Management

PM2는 내장 로그관리자가 있습니다. 모든 응용프로그램의 로그데이터를 모아서 보기 편하게 한곳에다 모두 작성을 합니다. 응용프로그램이 실제로 어떤 일이 일어나는지 확인하기 위해 로그 뒤에 log를 실시간으로 붙일 수 있습니다. PM2의 로그 관리자는 로그 순환도 가지고 있으며 특히 로그가 많이 나올 때 유용합니다.

  • pm2 logs - 실행 중인 모든 응용프로그램들의 출력로그 입니다
  • pm2 logs app - 앱 응용프로그램에서의 출력로그 입니다.
  • pm2 flush - 모든 로그 데이터를 날립니다, 디스크 공간을 확보합니다.

기억하세요 가장 중요한 것은 로그 로테이션을 사용하는 것입니다. 그렇게 하면 거대한 로그파일을 다수의 작은 파일로 쪼갤 수 있고 그러면 더욱 PM2가 잘 관리할 수 있습니다. 이렇게 하려면 다음의 명령어를 실행하면 됩니다.

pm2 install pm2-logrotate

만약 로그가 빈번하게 발생한다면 ELK와 같은 중앙화 로깅 서비스를 사용하는 것을 고려해보세요.

Best Practices

  1. 하나의 코드 기반에 수정 컨트롤을 추적하고 많은 배포를 해야함
  2. 명시적 선언과 의존성 독립
  3. 환경에 설정 저장
  4. backing 서비스들을 부착된 자원처럼 다룰 것
  5. 빌드와 실행 단계의 엄격한 분리
  6. 포트 바인딩으로 서비스를 내보내기
  7. 프로세스 모델로 스케일 아웃할 것
  8. 빠른 시작과 느린 종료로 견고함을 최대화 할 것
  9. 개발, 스테이징, 프로덕션을 가능한한 비슷하게 유지할 것
  10. 로그를 이벤트 스트림과 같이 취급할 것
  11. 어드민/관리자 작업은 한큐에 끝내라.

위의 규칙을 지키면 PM2를 효과적으로 사용하여 어떤 응용프로그램이라도 스케일할 수 있을 것이고 에러도 적게 될 것입니다.

Summary

  • PM2의 역할; Process manager, Node.js는 싱글 스레드 기반이므로 운영중인 프로세스를 중단하지 않고 업데이트 하는 것이 어렵다.
  • 여러개의 서비스가 동시적으로 돌아갈 수 있는데 PM2는 process.json 파일의 설정에 따라 알아서 관리해주고 자동 재시작 등을 지원하며 스케일 업/다운이 쉽다.

© 2019. All rights reserved.

Powered by Hydejack v8.1.1