요즘 사이드 프로젝트를 하는데 서버를 깃허브 액션으로 배포 자동화해서 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가지였다.
- 날짜가 지나면 해당 날짜로 된 이름으로 로그 파일 이름 변경
- 두 달 이상된 로그 파일 자동 삭제
이걸 어떻게 자동화할지 고민했는데 내가 머리 쓸 필요 없이 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로 하는 것도 나쁘지 않은 것 같다.