Backend

(AWS) 멀쩡하던 서버가 다운되었는데 이유를 모르겠다... 가 해결완료 (CPU 100%)

DevJake 2022. 7. 25. 17:24

현재 서비스하고 있는 앱이 있다. 

해당 앱에서 게시판 운영을 위해서 AWS EC2 서버에 Node.js 를 설치하여 운영하고 있었는데, 

운영 시작한지 이제.. 두달? 좀 안되었나? 서버가 자꾸 멈춘다. 

 

AWS EC2 서버

인스턴스 유형 : t2.micro

Node.js 에 javascript 로 작성한 파일을 넣어서 호스팅하고 있었고, pm2 module을 이용하고 있었다. 

 

무슨 일인가 AWS 콘솔에 들어가 해당 인스턴스를 선택한 후,

모니터링을 해보니 CPU 가 100% 로 돌고 있고.. 상태 검사도 1개가 에러나 있는 상태. 

여기저기 인터넷을 뒤져봤더니 대부분 '껐다 켜세요' 가 가장 많았다. 

인스턴스를 중지 했다가, 다시 시작하라는 것인데.. 

현재 서비스하는 중이라, 인스턴스를 중지했다가 다시 시작하면 퍼블릭ip 가 바뀌고, 

앱 내에 api 가져오는 링크가 담긴 url 을 수정해 줘야 한다. 

근데 이게 왠지 한번 껐다 켤 일이 아닌것 같다는 느낌이 와서 퍼블릭ip 를 유지할 수 있는 방법이 없을까 찾아봤다. 

그건 아래 링크 참조.. 이분이 너무 정리를 잘 해놓으셨다. 

https://hellocomputer.tistory.com/28

 

[AWS] EC2 인스턴스를 시작할 때마다 IP가 자동으로 바뀔 때 해결방법

※ 해당 글은 개인적인 학습 및 정리 목적에서 작성한 글이므로 참고 수준의 글로만 읽어주시기 바랍니다. 설명에 오류가 있는 경우 댓글로 지적해 주시면 감사하겠습니다. AWS에 처음 가입해

hellocomputer.tistory.com

 

아니나 다를까. 

인스턴스를 중지했다가 다시 시작햇는데 10분만에 다시 CPU 가 100% 를 찍는다. 

터미널로 ssh 접속하여 뭘 보려고 해도 뭔가 이상하다.. 터미널 속도가 엄청 느리다. 

ssh 접속도 잘 안될정도로..

 

아 이게 혹시 트래픽이 늘었나? 싶어서 아무리 찾아봐도 트래픽이 늘어난 것 같지는 않은데... 

해킹인가.. 별 생각을 다해보다가 

1차적으로 내린 결론은. 

뭐 잘은 모르니 일단 인스턴스가 t2.micro (vCPU 1, RAM 1GB)면 사양이 거의 최저나 마찬가지니.

사양 높은 인스턴스로 바꿔볼까? 생각하고 t3a.small(vCPU 2, RAM 2GB) 로 교체를 했다. 

음.. 일단은 멀쩡하게 돌아가나? 생각했는데.. 한시간 있다가 다시 뻗어버린다. 

이때까진 해킹인가 싶었다. 

 

역시 인터넷 열심히 검색.. 

log 파일이 문제 일수 있다는 글을 보고 미친듯 log 파일을 찾아봤다. 

일단 인스턴스를 큰걸로 늘려놓고 ssh 로 접속. 

리눅스에서 df -h 로 전체 용량을 확인했다. 

아 이거였나.. 전체 size 가 8G 인데 그게 꽉 차 있네. 

AWS 는 로그파일을 /var/log 에 저장한다고 하는구나. 

 

cd /var/log 

ls -alh 

 

오 뭔가 로그 파일이 많은....데.. 어 용량이 8G 는 택도 없는데 ...

 

이리 저리 찾아본 결과, 

Node.js에서 메인 자바스크립트 파일을 돌리려고 pm2 module을 깔아서 운영하고 있었고, 

모든 로그 파일이 pm2 를 통해 pm2 가 관리하는 로그 저장소에 쌓여가고 있었고, 

그 로그 저장소가 EC2 에 배정되어 있는 8G 를 몽땅 로그로 채워버려서 결과적으로 AWS 가 먹통이 되는 문제가 생긴거였다. 

pm2 로그 저장 위치로 가서 

cd /home/ec2-user/.pm2/logs

파일 목록을 살펴보니, 

ls -alh

index-out.log 라는 파일이 8G에 가까운 용량을 먹고 버티고 있었다. 

 

그럼 왜 로그가 저렇게 두달만에 쌓여버렸을까? 이 털것도 없는 서버를 누가 해킹이라도? 

요즘 서버 해킹해서 코인 채굴용으로 많이 쓴다던데 혹시? 

 

아니다. 

내가 잘못했다. 

게시판 운영을 위해 짜놓은 javascript 코드를 보니, 게시판 글들을 불러와서 화면에 띄우도록 해놓은 코드가 있는데 

그 게시판 글들을 죄다 log로 띄워놓도록 넣어놓았구나.. 

게시판 하루 사용자 (2000명) * (1명당 게시판 refresh 10번이라 치고....) * (30일..)

이용자가 적었으니 망정이지.. 서버 무제한을 하지 않았으니 망정이지.. 

로그땜에 망할뻔 했다. 

 

일단 해당 파일을 지우고, 

pm2 logrotate 라는 로그 분할 패키지를 추가로 설치했다. (설치방법은 검색하면 많이 나온다)

그러면 로그를 용량별로, 일자별로 분할하여 날짜 적어서 보관해 주고

pm2 logrotate 디폴트 설정

보기 쉽게 해주니까. 

 

1. 외부 IP 고정으로 설정해서 인스턴스를 중지했다 시작해도 바뀌지 않도록 설정하고

2. 기존 마구 쌓였던 용량이 큰 로그파일 삭제하고

(pm2가 아닌 AWS 에서 남기는 log의 경우는 껍데기는 놔두고 내용만 삭제해야 한다고 하네요. 그러지 않고 rm 명령어로 아예 삭제해버리면 AWS 이용시 오류가 발생한다고...)

3. 인스턴스는 t2.micro로 원복하고, 

4. 경보 2종류도 걸어놓고 (CPU 90% 넘으면 메일로 알람, 상태검사 오류나면 메일로 알람)

5. Node.js 안에 javascript 파일에서 필요없는 로그 남기는거 찾아서 수정하고, 

6. pm2 logrotate 추가 설치하고 

다시 행복한 서버생활을 하고 있다. 

 

추가로 리눅스 명령어 몇개 저장해놓고 글을 마친다.

df -h (전체 용량 확인)

sudo du -m / | sort -nr | head -10 (어떤 폴더에서 용량을 얼마나 차지하는지 용량 순서대로 확인)

ls -alh (각 파일별 용량 확인)

 

아래는 이 건 해결하면서 도움이 된 블로그 글들입니다. 

 

https://jjudrgn.tistory.com/28

 

리눅스 용량 부족할때 커널로그 삭제

우분투를 사용하던중 사용하던 kvm이 동작을 안하고 tab키를 눌러 자동완성을 하는것도 잘안되는 상황이 나타났다. -bash: cannot create temp file for here-document : No space left on device df -h 로 디스..

jjudrgn.tistory.com

 

https://velog.io/@doohyunlm/%EA%B8%B0%ED%83%80-nodejs-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-pm2%EB%A1%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0

 

etc - nodejs 프로젝트 pm2로 관리하기

목차 > 1. pm2란? > 2. pm2 사용하기 > 3. pm2-logrotate > 4. 마치며 프로젝트를 진행하며 가장 중요하고 많이 보게 되는 것이 바로 log입니다.

velog.io