Next.js EC2 배포 + PM2 활용한 무중단 배포

hzn·2023년 5월 17일
3

Deploy

목록 보기
8/10
post-thumbnail

Next.js로 만든 프로젝트는 Vercel을 사용하면 간단하게 배포할 수 있지만 (+ 자동으로 HTTPS, 국내 CDN이 적용된 상태로 배포된다..!) 배포 제한 사항에 걸린다거나(무료 사용자 기준으로 메모리 제한, 하루 당 빌드 개수 제한, Serverless Functions 관련 제한 등이 있다) 좀 더 커스텀 하고 싶다면 자유도가 높은 AWS를 선택할 수 있다.

1. EC2 인스턴스 생성

1. 인스턴스 시작

  • EC2 대시보드에서 인스턴스 시작 클릭

2. AMI(Amazon Machine Image) 선택

  • 용도에 맞는 운영체제와 소프트웨어를 선택한다.
  • 보통 Ubuntu Server 18.04 LTS를 많이 선택하던데 이제는 사라진 것인지 찾을 수가 없어 Ubuntu Server 20.04 LTS 버전을 선택했다.
  • AWS는 신규 고객에게 1년간 프리 티어를 제공하니까 프리 티어 사용가능 태그를 잘 확인하자..!

3. 인스턴스 유형 선택

  • 프리 티어가 가능한 t2.micro를 선택했다.

4. 키 페어 생성

  • 새 키 페어 생성

  • 키 페어 생성을 클릭하면 .pem 파일이 다운로드된다.
    이후 권한 설정 등에 필요하므로 쉽게 찾을 수 있는 경로에 두는 것이 좋음.

SSH 프로토콜을 통한 원격접속과 키 페어(.pem 파일)

  • SSH (Secure Shell) Protocol은 PC와 PC가 인터넷 등의 Public Network를 통해 서로 통신할 때 보안상 안정하게 통신을 하기 위한 프로토콜.
  • 다운로드 한 .pem 파일은 SSH 통신을 위한 키 페어 중 프라이빗 키가 기록된 파일이다. EC2 인스턴스에 연결을 할 때 사용하는 암호가 담겨있으니 관리에 유의해야 한다.

5. 인스턴스 시작

  • 인스턴스 시작 클릭

2. 원격 접속을 통해 인스턴스 사용하기

1. 인스턴스 연결 시작 (SSH 연결)

  • 연결 클릭

  • SSH 클라이언트 탭에서 명령어 확인

2. 키 페어 파일(.pem 파일) 권한 설정

chmod 400 .pem 파일 경로

참고 : chmod란?

  • SSH 접속을 위해서는 다운로드한 pem 키 파일에 대한 권한을 수정해줘야 한다.
  • chmod란 Linux의 기본 명령어로 change mode의 축약어이다. 해당 명령어를 통해 파일에 관한 권한을 설정할 수 있다.
  • chmod 400 pikadev1771.pem의 의미 : pikadev1771.pem 파일을 나에게만 읽기 권한을 부여
  • 키 페어 파일 권한을 설정하지 않은 경우 권한이 너무 open되어 있다는 경고 메시지와 함꼐 접속이 거절된다.

  • 이제 SSH 명령어를 통해 인스턴스에 접속할 수 있다.

3. 인스턴스 접속

  • cdm에 SSH 명령어 입력 (.pem 파일 경로 제대로 바꿔주기)


  • 아래 경고 메시지 나오면 yes 입력

  • 위와 같이 나오면 SSH 프로토콜을 이용한 원격 접속이 성공적으로 이뤄진 것이다. 이제 명령어를 통해 AWS에서 빌린 가상의 PC(인스턴스)를 사용할 수 있다.

3. 인스턴스 세팅하기

1. 기본 요소 설치

패키지 리스트 업데이트

sudo apt-get update 
  • apt(advanced package tool) : Ubuntu에서 사용하는 패키지 관리 시스템.
  • 패키지를 install, upgrade, clean할 때는 apt-get을 사용한다.
  • 새로운 패키지를 찾고자 할 때는 apt-cache를 사용한다.

nvm 설치

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

nvm 활성화

. ~/.nvm/nvm.sh

최신 버전의 node 설치

nvm install node 
또는
nvm install --lts

2. yarn 설치하기

sudo npm install -g yarn

4. 프로젝트 가져오기

1. 깃허브 레포지토리 클론

  • HTTPS로 주소 복사

  • git clone 복사해 온 주소

2. 프로젝트 빌드

  • clone 받아온 프로젝트 폴더로 이동

  • yarn 패키지 매니저 설치

    curl -o- -L https://yarnpkg.com/install.sh | bash
  • package.json에 명시돼있는 패키지 설치

    yarn install
  • 빌드

    yarn build

5. 포트 포워딩

  • URL 끝에 포트 번호를 붙여주지 않고 접근할 수 있도록 포트 포워딩을 해준다.
  • 포트 번호가 붙지 않은 URL은 사실 기본 포트 번호인 80번을 사용하는 상태의 접근이다. 이를 자동으로 현재 서버가 열린 3000번 포트로 보내주기 위해 '포트 포워딩'을 한다.
  • 포트 포워딩은 보통 nginx를 이용하거나 우분투 기본 명령어를 사용한다.

우분투 기본 명령어 사용한 포트 포워딩

sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

6. 서버 실행 및 접속

  • 서버 실행

    yarn start
  • 애플리케이션 접속
    : EC2 인스턴스 콘솔에 나와있는 자동 할당된 IP 주소 또는퍼블릭 IPv4 DNS로 배포한 애플리케이션에 접속할 수 있다.

✅ 이렇게 열린 서버는 SSH 연결을 종료하는 순간 함께 종료된다. 서비스가 계속해서 열려있기를 원한다면 무중단 배포가 필요하다.

7. PM2를 이용한 무중단 배포

  • PM2 : Node.js의 프로세스 매니저. 애플리케이션을 온라인으로 관리하고 유지하는 데 도움을 준다.

  • PM2 global로 설치

    npm install pm2 -g
  • PM2 실행 (해당 프로젝트 폴더 위치에서 실행)

    pm2 start yarn -- start

✅ 이제 EC2 인스턴스가 꺼지지 않는 이상, SSH 연결을 종료해도 서비스가 중단되지 않는다.

0개의 댓글