쑥멍
쑥로그
쑥멍
전체 방문자
오늘
어제
  • 분류 전체보기 (65)
    • 메모 (0)
    • 안드로이드 (4)
      • 팁 (1)
      • 프로젝트 (3)
    • 파이썬 (1)
    • 스프링 (26)
      • 프로젝트 (16)
      • 에러 아카이빙 (1)
      • 해부 (9)
      • 튜토리얼 (0)
    • 리눅스 (3)
    • CS (14)
      • 컴퓨터구조 & OS (8)
      • 클린 아키텍처 (6)
    • 낙서 (5)
      • 일기 (0)
      • TIL (2)
      • 고민 (2)
    • 게임 (1)
      • 야숨 (1)
    • C (0)
    • Go (3)
    • Django (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅜ
  • ㅁ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쑥멍

쑥로그

pm2로 스프링 서버 배포
카테고리 없음

pm2로 스프링 서버 배포

2024. 6. 24. 11:58

요즘 사이드 프로젝트를 하는데 서버를 깃허브 액션으로 배포 자동화해서 EC2에 돌리고 있다. 서버 돌리는 스크립트는 그냥 다들 자주 쓰는 nohup 어쩌구고. 로그도 만들어주는 스크립트가 있길래 복붙했다. 기본 명령어만으로 했다는 뜻이다.

#!/usr/bin/env bash

...

echo "$TIME_NOW > $API_GATEWAY_SERVER_JAR 파일 복사" >> $DEPLOY_LOG
cp "$API_GATEWAY_LATEST_JAR" "$API_GATEWAY_SERVER_JAR"

echo "$TIME_NOW > $API_GATEWAY_SERVER_JAR 파일 실행" >> $DEPLOY_LOG
nohup java -jar $API_GATEWAY_SERVER_JAR > $API_GATEWAY_SERVER_APP_LOG 2> $API_GATEWAY_SERVER_ERROR_LOG &

API_GATEWAY_SERVER_PID=$(pgrep -f $API_GATEWAY_SERVER_JAR)
echo "$TIME_NOW > 실행된 API Gateway Server 프로세스 아이디 $API_GATEWAY_SERVER_PID 입니다." >> $DEPLOY_LOG

 

그리고 서버가 실행 중인지 확인할 때는 ps -ef | grep java 명령어를 썼다. 

 

이 방식도 나쁘지 않고 별 문제는 없었지만 pm2를 쓰게 된 계기는 서버가 강제종료되었을 때 디스코드나 슬랙으로 알림 보내는 기능을 구현할 때 좋다는 이야기를 어디서인가 들어서이다. 

 


설치하는 법

1) node.js부터 설치

sudo apt install nodejs npm

 

2) pm2 설치

sudo npm install pm2 -g
pm2 --version

끝이다. 매우 간단하다.

 

서버 배포하는 법

// start.json
{
  "apps": [
    {
      "name": "discovery-server",
      "script": "java",
      "args": ["-jar", "/home/ubuntu/app/discovery-server/discovery-server.jar"],
      "cwd": "/home/ubuntu/app/discovery-server"
    },
    ...
  ]
}

EC2에서 nano start.json을 쳐서 위와 같이 적당한 스크립트 내용을 작성한다. 저 name 속성으로 서버를 식별해서 시작하거나 중지할 수 있다. 

 

# jar 파일들 있는 경로
sudo chmod -R +x /home/ubuntu/app/

pm2 start /home/ubuntu/app/start.json

매번 깃허브 액션으로 배포되어서 jar 파일들이 바꿔치기되니까 권한 설정하기 귀찮으니 쉘 스크립트 파일을 하나 만든다.

pm2 start 명령어로 서버를 실행시킬 수 있다. 

 

시작되면 이렇게 아름다운 표로 출력이 된다. CPU, 메모리 사용량도 한 눈에 확인할 수 있다. 

 

멈추려면 그냥 이렇게 하면 된다.

pm2 stop start.json

다 멈추려면 이렇게 하고, 특정 서버만 멈추게 하려면 위 사진에 있는 name이나 id를 start.json 대신에 입력하면 된다.

 

로그 관리하는 법

로그 관리에 대해서도 고민을 했는데, 내가 원하는 건 2가지였다.

  1. 날짜가 지나면 해당 날짜로 된 이름으로 로그 파일 이름 변경
  2. 두 달 이상된 로그 파일 자동 삭제

이걸 어떻게 자동화할지 고민했는데 내가 머리 쓸 필요 없이 pm2 logrotate 모듈을 쓰면 1분이면 해결 가능하다.

 

1) pm2 logrotate 설치

pm2 install pm2-logrotate

 

2) 원하는 대로 커스텀

pm2 set pm2-logrotate:max_size 50M			# 로그 파일 최대 크기
pm2 set pm2-logrotate:compress true			# 압축할건지 여부
pm2 set pm2-logrotate:rotateInterval '0 0 * * *' # 로테이션 간격(기본값: 0 0 * * *)
pm2 set pm2-logrotate:retain 60				# 로그 파일 수명 제어

위와 같이 설정하면

  • 로그 파일 크기가 50MB가 넘어가면 새로 생성이 됨
  • 로그 파일을 압축해서 디스크에서 많은 용량을 차지하지 않게 해줌
  • 매일 자정에 새로운 로그 파일 생성(지난 로그 파일은 이름에 날짜 붙어서 저장됨)
  • 60일 지난 로그 파일들 삭제

이렇게 된다.

 


슬랙으로 알림 보내는 법

이것도 모듈 설치하고 설정만 해주면 1분 만에 가능하다.

1) pm2-slack 설치

pm2 install pm2-slack

 

2) 슬랙 웹훅 URL 설정

pm2 set pm2-slack:slack_url https://...

 

3) 원하는대로 커스텀

pm2 set pm2-slack:error true
pm2 set pm2-slack:kill true
pm2 set pm2-slack:exception true
pm2 set pm2-slack:stop true
pm2 set pm2-slack:restart overlimit true
pm2 set pm2-slack:exit true

더 많은 설정을 보려면 pm2 conf pm2-slack 명령어 치고 원하는 대로 설정하면 된다. 


결론

설치가 매우 쉬운 것에 비해 제공하는 기능이 유용하다. 사실 프로메테우스, 그라파나로 관리하려고 했는데 아직 내 수준에 잘 다룰 수 있을 것 같지 않고 실제 운영 중인 서버도 아니라 pm2로 하는 것도 나쁘지 않은 것 같다. 

    쑥멍
    쑥멍

    티스토리툴바