프론트엔드 서버를 배포하며 백엔드 서버가 필요해서 express를 통해 함께 만들어서 배포를 하던 중에 express는 docker를 활용하기 위해서는 build의 과정이 매우 복잡하다는 것을 알게 되었다.
그래서 다른 방법을 찾던 중, 배포에서 중요하게 생각할 점은 바로 콘솔을 종료하였을 경우에 돌아가던 코드가 모두 멈추고 종료된다는 것이고, 이것을 막기 위해서 백그라운드에서 코드가 항상 실행되도록 바꿔야한다는 것이다.
그래서 이것을 위한 방법을 소개하려고 한다.
이전의 배포에서는 아마존 리눅스를 활용하여 배포를 진행했는데 express는 우분투를 활용해서 배포를 하려한다.
- ec2를 우분투의 LTS(안정성이 높은 버전), 프리티어 중의 하나로 생성한다.
- node 설치
$ sudo su $ apt-get update && / apt-get install -y ca-certificates curl gnupg && / mkdir -p /etc/apt/keyrings && / curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && / NODE_MAJOR=20 && / echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list && / apt-get update && / apt-get install nodejs -y
- git clone '깃주소'
- cd '경로'
- npm install
- 코드 실행
위를 통해서 기본적으로 서버를 배포하여 ec2의 퍼블릭 주소만으로 접근이 가능해진다.
문제는 ec2 콘솔이 종료될 경우에 프로그램도 함께 종료되는 문제가 생겨 백그라운드에서도 작동하여 ec2 콘솔이 종료되어도 계속 프로그램이 돌아갈 수 있도록 한다.
nohup
을 통해서 프로세스가 종료되는 것을 막는다.
명령어는 nohup yarn start &
와 같이 nohup ~ &
의 가운데에 프로그램 시작 코드를 작성한다.
nohup
을 통해서 백그라운드로 실행하는 것을 성공했지만, ec2 콘솔을 꺼버리면 똑같이 실행이 되지 않는 문제가 있었다.
해결방법을 찾는 중에 ec2 콘솔을 강제 종료하면 이런 현상이 발생한다는 것을 알게 되었다.
따라서 ec2 콘솔을 정상적으로 종료하기 위해서 exit
명령어를 사용하면 백그라운드에 실행되고 있는 프로세스가 ec2 콘솔을 종료하여도 계속 돌아가는 것을 확인할 수 있다.
추가적으로 pm2라는 라이브러리가 있는데 npm start, yarn start 같이 코드를 실행하는데 쓰는 라이브러리이다.
express의 경우에는 코드가 변경되어도 그 결과가 즉각 반영되지 않고, 한번 종료한 후에 다시 실행해야하는 불편함이 있는데 pm2 start를 통해서 실행하면 그 불편함을 덜어낼 수 있다.