pm2?
배포한 환경에서 백그라운드에서 서비스를 안정적으로 운영할 방법을 찾던 중, Next.js를 배포한 개발자들이 PM2를 사용해 애플리케이션을 관리하고 있는 것을 발견했습니다. 이를 통해 PM2가 서비스를 백그라운드에서 안정적으로 실행하고 관리하는데 유용하다는 것을 알게 되었습니다. PM2는 애플리케이션을 재시작, 모니터링, 로드밸런싱 등의 기능을 제공하여, 특히 프로덕션 환경에서 서버의 안정적인 운영을 보장해 줍니다.
- 애플리케이션 실행 및 관리: 여러 Node.js 애플리케이션을 쉽게 실행하고, 중단 없이 자동 재시작
- 애플리케이션 모니터링: 애플리케이션의 메모리, CPU 사용량 등을 실시간으로 모니터링.
- 로드 밸런싱: 클러스터 모드로 다중 CPU 환경에서 애플리케이션을 효율적으로 실행.
- 로그 관리: 애플리케이션의 실행 로그를 쉽게 확인하고 관리.
- 자동 재시작: 서버가 다운되거나 애플리케이션이 충돌할 때 자동으로 재시작.
즉, PM2는 Node.js 애플리케이션의 안정적인 운영과 모니터링을 돕는 도구입니다.
pm2 설치
pm2를 사용하기 위해서는 인스턴스에 pm2를 설치해야 합니다.
📌 초기에 pm2를 설치했을 때 배포 명령어가 인식을 못하는 문제가 있었는데 전역으로 깔아야 문제가 생기지 않더라고요!
pm2 전역으로 깔기
sudo npm install -g pm2
그 이후에는 잘 깔렸나 버전 확인을 해봅니다.
pm2 --version
pm2 주요 기능 사용
저희 인스턴스에 접속하시면 바로 확인하실 수 있습니다!
pm2 list
• id: 프로세스의 ID를 나타냅니다. 여기서는 0번 프로세스가 실행 중입니다.
• name: 프로세스의 이름입니다. 여기서는 npm이라는 이름의 프로세스가 실행 중입니다. 이 이름은 pm2 start npm -- start 명령으로 실행된 애플리케이션을 나타냅니다.
• mode: 프로세스가 어떤 모드로 실행되고 있는지 나타냅니다. 여기서는 fork 모드입니다. 이는 애플리케이션이 단일 인스턴스로 실행 중임을 의미합니다. PM2는 클러스터 모드와 포크 모드 중 하나로 애플리케이션을 실행할 수 있는데, 포크 모드는 기본적으로 하나의 인스턴스를 실행하는 방식입니다.
• ↺ (restart count): 프로세스가 재시작된 횟수입니다. 여기서는 0번으로, 아직 재시작된 적이 없음을 나타냅니다.
• status: 프로세스의 현재 상태입니다. 여기서는 online으로, 애플리케이션이 정상적으로 실행 중임을 의미합니다.
• cpu: 프로세스가 사용 중인 CPU 자원의 비율입니다. 여기서는 0%로 나타나고 있으며, 현재 CPU를 거의 사용하지 않고 있음을 의미합니다.
• memory: 프로세스가 사용 중인 메모리의 양입니다. 여기서는 75.6MB를 사용 중임을 나타냅니다.
pm2 logs
PM2로 실행 중인 애플리케이션의 로그를 실시간으로 확인할 수 있게 해주는 기능입니다.
1. 실시간 로그 확인: 애플리케이션에서 출력하는 로그를 실시간으로 보여줍니다.
2. 에러 로그 확인: 애플리케이션에서 발생하는 오류 로그(stderr)를 바로 확인할 수 있습니다.
3. 프로세스별 로그: 여러 개의 프로세스가 실행 중인 경우, 각 프로세스의 로그를 구분해서 볼 수 있습니다.
4. 로그 기록 파일: PM2는 로그를 파일로 기록하는데, 이 명령어로 로그 파일의 내용을 실시간으로 출력해 줍니다.
아래와 같이 실시간으로 에러나 실행 로그를 확인할 수 있습니다!
github Actions의. yml 파일 (마지막 부분)
script: |
cd /home/ubuntu/app
npm install
npm run build
pm2 stop all || true
pm2 start npm -- start
pm2 save
exit
1. 프로젝트 디렉터리로 이동 (cd).
2. 의존성 설치 (npm install).
3. 애플리케이션 빌드 (npm run build).
4. PM2로 실행 중인 기존 애플리케이션을 중지 (pm2 stop all).
5. PM2로 새로운 애플리케이션 실행 (pm2 start npm -- start).
6. 실행 중인 애플리케이션 상태 저장 (pm2 save).
7. SSH 세션을 종료 (exit).