개발노트/Note

No.1Reciepe - 서버 다운..

Dahoon06 2023. 3. 23. 22:58
728x90
반응형

시간이 날 때 하자 해서 미루고 미루었던 파일 업로드 api를 만들고 deploy 브랜치에 코드를 올렸다.
 
근데 서버가 죽었다..
처음에는 콘솔에 cors가 찍혀있길래 어??? 갑자기 왜???
그래서 다시 배포를 해보았는데 맙소사... 서버가 켜지질 않는다..
 
와 진짜... 어떻게 해놓은건데 서버가 그래버리나..
부랴부랴 새벽에 찾아보면서 일단 대충 도커를 새로 빌드해보고, ec2도 껏다켜보고... 했는데 세상에
이제는 github actions 도 안되는것...
 
먼저 어디서 에러가 났는지 알고싶어 로그를 확인해보려고 EC2에 접속하였다.
로그 확인전에 컨테이너가 돌아가는지 확인을 하려고 했더니..
 

확인도 못해....ㅋㅋㅋㅋㅋㅠㅠㅠㅠㅠㅠ

 
권한 문제의 경우는 블로그를 찾아다니면서 쉽게 해결할 수 있었다.
 

# 1. 보통은 docker group이 있지만, 없다면 생성해준다
sudo groupadd docker

# 2. docker group에 해당 유저를 추가 (현재 로그인 중인 유저를 추가해준다.)
sudo usermod -aG docker $USER

# 3. 로그아웃 후 다시 로그인 또는 명렁어를 실행시켜주면 적용이 된다.
newgrp docker

 
그리고 나서 로그를 열어보았다.
 

 
오...완전 처음 보는 상황
저건 또 뭔가.. 왜 저렇게 화를 내고 있는 건가....
 
이번에 S3 api를 추가하면서 aws-sdk 모듈을 하나 다운 받았다.
그 모듈을 다운 받고 나서부터 저 상태니까 그 모듈을 받았던게 문제인것 같은데
저기서 말하는 Reached heap limit Allocation failed - JavaScript heap out of memory 는 뭘까
그냥 언뜻 봤을 때 메모리가 부족해서 실행이 안되는거 같은데
 
찾아보니까 Heap 영역에 메모리가 부족하여 실행이 안됐던거다.
 
해결 방법으로는 2가지가 있는데
 
첫번째로는 더 큰 메모리를 할당해주기,
두번째로는 메모리 누수 검사를 진행하여 누수가 일어난 곳을 수정하는 것.
 
일단 첫번째로 해결은 했는데 첫번째의 경우는 완전한 해결법은 아니라고 한다.
그냥 말 그대로 임의로 메모리를 늘려줘서 실행이 되도록 한 것이니까
 
급한대료 start 스크립트를 수정해줬다.
 

 "start:prod": "node dist/main.js --max-old-space-size=8192",

 
--max-old-space-size=8192 옵션을 주어 메모리를 8기가로 늘려주었다.
찾아보니까 Nodejs의 기본 메모리는 512mb라고 한다. 그렇기 때문에 처음에 개발할 때야 작성한게 많이 없었으니까 괜찮았지만 개발을 하면 할 수록 파일의 크기는 점점 커지게 되고 결국 기본 메모리가 초과된 것이다.
 

(일단 메모리 할당으로 해결했지만 메모리 누수 검사도 진행해봐야겠다...)

 
서버의 경우는 저 부분을 수정하는 것으로 해결은 됐다.

그 다음이 github actions 였는데... 알고보니 원인 정말 단순했다.

첫번째로 잘못했던 부분은 도커 허브의 경우 내 계정이 아니여서 확인이 어려워 계정을 바꾸는 부분에서의 실수가 있었다.

패스워드 입력 란에 도커허브 키를 입력해야하는데 내 패스워드를 넣었기 때문에 로그인이 되지 않았던 거였다.

하지만 build만 되고 deply job은 실행이 되질 않았다.

이 부분도 정말 단순한 문제였는데 둘 다 원인을 모르니 러너를 지우고 다시 설정 해보자고 해서 러너를 지우고 액션을 다시 설치하는데 이 때 ec2가 너무 느려져서 설치 및 설정이 제대로 되지 않았던 거였다.

그래서 깃허브에서 액션이 실행이 되는데 러너를 찾지 못해서 계속 wait 걸려있는 거였고 ec2가 뭔가 이상한지 러너 또한 계속 종료되고..

그래서 다시 지우고 ec2 재시작하고 다시 러너를 설치하는데 이전에 설치했을때 보지 못했던 설정하는 부분이 나와 다 됐다 했는데 한가지 문제가 있었다.

러너를 설정할 때 라벨을 정할꺼냐고 묻는 부분이 있다. 근데 설치할 때 이 부분을 넘겼는데 우리 main.yml의 run-on 에 라벨을 지정해 놨던 것이다.

그래서 액션이 실행은 되는데 서로 라벨이 안맞으니까 러너를 찾지 못해서 계속 wait 상태 였던거다.

어쨋든 부랴부랴 다시 서버는 켜졌고 액션도 잘 돌아간다.. 후

728x90
반응형