GIVEN'S LOG

AWS(EC2,Route 53) 과 NginX로 Next 배포하기
dev
Next 배포하기
AWS(EC2,Route 53) 과 NginX로 Next 배포하기
#Next
#AWS
#EC2
#Route 53
#NginX

AWS(EC2,Route 53) 과 NginX로 Next 배포하기


  1. AWS EC2 인스턴스 생성
  2. 보안 그룹 추가 ->  SSH를 위한 22포트, http를 위한 80포트, https를 위한 443포트를 추가
  3. 인스턴스 연결
  • 콘솔에서 내가 생성한 인스턴스로 들어가 연결 버튼을 클릭 (생성 직후 약간의 시간 소요)
  • 'ssh 클라이언트' 탭에서 퍼블릭 DNS를 사용해 인스턴스에 연결. 터미널 열어서 pem 아니면 ppk 있는 폴더에서 명령어는 예시에 있는 것을 그대로 사용


터미널에서 서버 세팅


1.settings

# 관리자 계정 패스워드 생성
sudo passwd

# 우분투 시간대 설정
sudo timedatectl set-timezone Asia/Seoul

# 패키지 매니저 최신으로 업데이트
sudo apt update

# 필수 패키지 설치 nginx 등등
sudo apt install nginx net-tools htop

# nvm 설치 
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
# Zsh 사용자
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | zsh

# nvm 활성화
source ~/.bashrc
# Zsh 사용자
source ~/.zshrc

# 확인
nvm -v

# node 설치
nvm install node  # 최신 버전 설치
nvm install --lts # 최신 LTS 버전 설치
nvm install 16.14.0  # 특정 버전 설치
nvm install 16  # 특정 버전 16의 최신 릴리즈 설치


unbuntu node 세팅 참고


2. 프로젝트 clone

보통 프로젝트들은 /var/www 경로에 위치해 있다. AWS ubuntu는 git을 기본으로 설치해두기 때문에 따로 깃은 설치할 필요가 없지만, clone을 위해서 ssh 키를 먼저 만들어야 할 필요가 있다.

  • ssh-keygen 명령어로 ssh키를 생성한다.
  • ssh public 키는 보통 /root/.ssh/id_rsa.pub 경로에 생성된다.
  • cat ~/.ssh/id_rsa.pub 명령어로 퍼블릭키를 복사해서 깃 계정에 등록하고 클론


# ssh키 생성
ssh-keygen

# 생성된 퍼블릭 키 열기
cat ~/.ssh/id_rsa.pub

# 원하는 레포지토리 클론 (/var/www/ 경로)
git clone [git repo 경로]
# yarn, pm2 글로벌 설치
npm install -g yarn


3. 편의성을 위한 세팅1 - 메모리 스왑

일단 서버에서 Next.js를 실행하고, 외부 클라이언트 요청에 따라 리버스 프록시로 프로젝트를 보여줄 준비는 마쳤다.

다만 clone 받은 프로젝트의 모듈을 설치하고 빌드하는 과정에서 시스템이 자주 멈추어버리는 현상이 발생하는데, 이를 위해 메모리 스왑부터 하려 한다.

  • 2gb의 스토리지 용량을 메모리로 사용할 수 있도록 아래 명령어 실행
  • 실제 메모리처럼 빠른 속도는 아니지만 작업에 도움이 될 수 있다.
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 성공했는지 확인
swapon -s

# 재시작 할 때마다 메모리 할당
sudo vim /etc/fstab
/swapfile swap swap defaults 0 0

# 메모리 적용 확인
free
여기까지 참고한 블로그


4.pm2 설치

npm i -g pm2
pm2 list


5.pm2 실행

애플리케이션을 클러스터 모드로 실행 하기 위해서 프로젝트 루트 폴더에 ecosystem.config.js 파일을 저장한다. ecosystem.config.js 파일은 PM2 프로세스 매니저가 사용하는 설정 파일이다.


module.exports = {
  apps: [{
      name: 'minsunblog', 
      cwd: './',
      script: 'node_modules/next/dist/bin/next',
      args: 'start',
      exec_mode: 'cluster', 
      instances: 0, 
      autorestart: true, 
      listen_timeout: 50000,
      kill_timeout: 5000
  }]
}

name: 애플리케이션의 이름을 지정합니다.

cwd: 현재 작업 디렉토리를 지정합니다. 일반적으로 실행 파일이 있는 디렉토리를 가리킨다.

script: 실행할 스크립트 파일을 지정합니다. 여기서는 Next.js의 실행 파일 경로를 지정하고 있다.

args: 스크립트에 전달할 인자를 지정합니다. start를 전달하여 Next.js 애플리케이션을 시작한다.

exec_mode: PM2에서 애플리케이션을 실행하는 모드를 지정한다. cluster 모드를 사용하고 있으며, 이는 멀티 프로세스 클러스터 모드를 의미한니다.

instances: 클러스터 모드에서 실행할 인스턴스 수를 지정한니다. 여기서는 0을 설정하여 CPU 코어 수에 따라 자동으로 인스턴스를 할당하도록 합니다.

autorestart: 애플리케이션의 비정상 종료 시 자동으로 다시 시작할지 여부를 지정한다.

listen_timeout: 애플리케이션 시작 후 대기할 수 있는 시간을 지정합니다.

kill_timeout: 프로세스 종료를 위해 대기할 시간을 지정합니다.


pm2 start ./ecosystem.config.js

# 참고: pm2 끄는 법
npx pm2 kill


6.nginx 세팅


nginx.conf 에 들어가 설정을 추가해준다.


nano /etc/nginx/nginx.conf


include 바로 아래에 다음 코드를 추가해준다.


********** HTTP 안에 있는 include 아래여야한다.


server {
       server_name 도메인이름
       listen 80;
       location / {
                proxy_set_header HOST $host;
                proxy_pass http://127.0.0.1:3000;
                proxy_redirect off;
       }
}


이제 포트 번호를 기입하지 않고 페이지에 들어갈 수 있다.


7.NginX 서비스 재시작


sudo nginx -t ### text가 성공 해야함
sudo systemctl reload nginx


8.HTTPS 적용

https로 설정하기 위해서는 인증서가 필요해서 Let's Encrypt에서 무료로 발급해주는 인증서를 활용 하면된다.

이전에 설치되어있던 certbot 삭제 (충돌 방)


sudo apt-get remove certbot

certbot 설치


sudo snap install certbot --classic
/** certbot 설치 */
sudo certbot --nginx
/** SSL 인증서 발급 */

설치하면 안내 글이 나오는데

Enter email address 가 나오면 이메일을 적고 넘어가면 된다.

Certbot으로 자동 갱신 설정

설정 파일 들어가서 1번 “/bin/nano” 를 선택하면 된다.


sudo crontab -e

하단에 아래 코드 적고 Ctrl + X -> y -> Enter로 나오면된다.

매월 1일 오후 6시마다 인증서를 갱신하고 NGINX를 재시작하는 명령어가 실행된다.


0 18 1 * * certbot renew --renew-hook="sudo systemctl restart nginx"


이러면 끝


잘 설명해준 블로그



참고로 AWS가 아닌 외부 도메인 연결하는 법

그리고 탄력 IP 받는 법과 연동 법