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

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

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

Written by Given at2024.03.13

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

  • AWS EC2 인스턴스 생성
  • 보안 그룹 추가 -> SSH를 위한 22포트, http를 위한 80포트, https를 위한 443포트를 추가 인스턴스 연결
  • 콘솔에서 내가 생성한 인스턴스로 들어가 연결 버튼을 클릭 (생성 직후 약간의 시간 소요) '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의 최신 릴리즈 설치

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: "PROJECT NAME", 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: 프로세스 종료를 위해 대기할 시간을 지정.

PS. 여기서 pm2에 프로젝트 PORT 번호를 따로 설정하고 싶으면 apps 배열 안 객체에

env: { PORT: PORT_NUMBER as number; }

추가

pm2 start ./ecosystem.config.js # 참고: pm2 끄는 법 npx pm2 kill

6.nginx 세팅

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

nano /etc/nginx/nginx.conf

안되면 권한문제일 가능성이 있으니 앞에 sudo를 붙여준다. 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"

이러면 끝