본문 바로가기
Development

Node.js AWS EC2 배포 (nginx, PM2, Letsencrypt 사용)

by OG(오지) 2020. 4. 5.

안녕하세요. 휴몬랩에서 개발하는 OG입니당 :-)

최근 Node.js 프로젝트를 AWS EC2로 배포하였는데, 오늘은 그 과정을 공유해볼까합니다. 

 

Node AWS Hosting 이라고 구글링을 하면 보통 AWS EB (AWS Elastic Beanstalk)을 이용한 배포 방법이 나옵니다. 하지만 Elastic Beanstalk을 이용한 배포도 장단점이 있고, 저에게는 단점이 더 크게 느껴져 EC2를 이용해 자체적으로 배포하였습니다. 

 

AWS Elastic Beanstalk을 이용한 Node 앱 배포의 장점
1. 빠르게 배포할 수 있다.
2. 알아서 기본 세팅과 안정화 작업 등을 해준다. (Security Group, Load Balancing 등)

AWS Elastic Beanstalk을 이용한 Node 앱 배포의 단점
1. 지원하는 Node 버전이 낮아 개발 시부터 호환을 고려해야 한다.
2. 장점 2번 때문에 뜻하지 않은 금액이 나갈 가능성이 있다.
   - Load Balancing 서비스의 경우 request 마다 금액이 부과된다.

AWS에서 처음 배포를 할 경우 어디서부터 무엇을 어떻게 해야하는지 찾는게 가장 어렵더라구요.
따라서 본 글에서는 각 단계별 자세한 내용은 생략하고, Node 앱을 AWS EC로 배포하면서 겪어야 하는 과정을 정리하여 작성하였습니다. 자세한 내용은 구글링으로 찾아보시고, 궁금한 점이 있다면 댓글 남겨주세요 ! 

 

1. AWS EC2 인스턴스를 생성합니다.

UBUNTU 혹은 AMI 중 선택하여 인스턴스를 생성합니다. 

 

2. 탄력적 IP를 연결합니다.

탄력적 IP를 생성하고 위에서 생성한 인스턴스를 연결합니다.

탄력적 IP를 연결해야 인스턴스의 IP를 고정할 수 있습니다.

 

3. 보안그룹 인바운드 / 아웃바운드 규칙을 설정합니다.

인스턴스에 연결된 보안 그룹의 인바운드/아웃바운드 규칙을 설정합니다.

외부에서 접근할 수 있게 하려면 인바운드 규칙을 0.0.0.0/0으로 설정(오픈!)해야 합니다.

HTTP와 HTTPS를 둘다 열어줍니다. 

(차후에 HTTP 접근을 HTTPS로 redirect 시켜주기 위해서도 HTTP를 열어주어야 합니다.)

 

3. SSH로 접속하여 필요한 패키지들을 설치합니다.

* 관리자 권한(root)을 만들고 관리자 권한으로 전환합니다.

관리자 권한을 만들지 않고 진행할 수 있지만 관리자 권한으로 진행하는 게 추후 Permission Denied 에러가 덜 날 수 있는 방법입니다. 

sudo passwd root  # root 계정 패스워드 설정
su # 관리자 권한으로 전환

 

* nvm 설치하고, 원하는 node 버전을 설치합니다.

sudo apt-get update
sudo apt-get install build-essential libssl-dev


curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh -o install_nvm.sh 
bash install_nvm.sh 
source ~/.profile

nvm --version # 설치 확인
nvm install {version} # 예시 - nvm install 12.16.1

node --version # 확인

 

* nginx를 설치합니다.

sudo apt-get install nginx

 

* nginx를 테스트합니다.

systemctl start nginx

위의 명령어를 입력하면 nginx 를 시작할 수 있습니다. 위에서 설정한 ip를 입력하면 아래와 같은 화면이 뜹니다. 

 

4. 프로젝트 가져오고 세팅하기

ftp 프로그램으로 직접 프로젝트를 넣어도 되지만, 저의 경우에는 git으로 배포 버전을 관리하기 위해 git으로 clone하였습니다. 

프로젝트는 /var/www/html 폴더 안에 넣는 것이 보통입니다.

 

nginx 설치 후 /var/www/html 폴더 안에 파일을 보면, index.nginx-debian.html이라는 파일이 있습니다. ip에 들어가서 봤던 위의 화면이 바로 이 html 파일입니다.

 

/var/www/html 폴더 안에서 `git clone...` 을 해서 프로젝트를 불러옵니다.

 

5. PM2 설치 및 실행

pm2는 node.js 실행을 도와주는 프로세스 관리자입니다. (pm2 documentation

pm2 실행을 위해 저는 process.yml 파일을 만들어 앱 이름, 스크립트, 환경변수 등을 설정하였습니다.

 

apps:
  - name: fc-api
    script: npm
    args: start
    instances: max
    watch: true
    exec_mode: cluster
    merge_logs: true
    autorestart: false
    env:
      NODE_ENV: development
      APP: development
      PORT: 3333

process.yml 예시

 

pm2 설정이 끝나면 실행합니다.

npm i # 패키지 설치
npm run build # 빌드하기

npm i -g pm2 # pm2 설치 
pm2 start process.yml # 실행
systemctl start nginx # nginx 실행

 

위와 같이 매번 pm2 실행, nginx 실행을 명령어로 입력해도 되지만 간편하게 쉘 스크립트로 작성해두고 실행할 수도 있습니다.

 

#!/bin/bash
pm2 delete fc-api;
pm2 start process.yml;
echo 'start fc-api by pm2... in local';
sleep 1;
sudo systemctl start nginx;
echo 'Start nginx server...';
echo 'All done';

start.sh 예시

 

#!/bin/bash
pm2 stop fc-api;
echo 'Stop fc-api by pm2';
sleep 1;
sudo systemctl stop nginx;
echo 'Stop nginx server...';
echo 'All done';

stop.sh 예시

 

#!/bin/bash
pm2 restart fc-api;
echo 'Restart fc-api by pm2 ';
sleep 1;
sudo systemctl restart nginx;
echo 'Restart nginx server...';
echo 'All done';

restart.sh 예시

 

sh 파일은 ./start.sh 와 같이 실행할 수 있습니다.
만약 Permission Denied 에러가 발생할 경우
chmod -R 775 ./start.sh <- start.sh 파일에 대한 권한 변경
위의 명령어 입력 후 실행하면 됩니다.

 

6. nginx 설정하기 (proxy 경로 설정)

vi /etc/nginx/sites-available/default 로 들어가면 nginx 설정 파일을 수정할 수 있습니다.

아래와 같이 변경합니다.

root /var/www/html; # 지우기
index index.html index.html index.nginx-debian.html; # 지우기 


server_name www.website.com; # 수정
location / {
		proxy_pass http://localhost:3333; # 추가
		
}

localhost:3333 에서 3333은 설정한 포트 넘버를 적으면 됩니다.

마찬가지로 server_name도 연결할 사이트 이름을 적으면 됩니다. (이후 HTTPS 용 SSL 인증서 발급 시 이 이름대로 발급됩니다)

 

설정 후 nginx를 재실행하고, 프로젝트가 잘 뜨는지 확인합니다. 

 

7. Router53으로 주소 연결하기

탄력적 IP가 아닌 웹사이트 이름으로 접속할 수 있게 만들기 위해선 Route53으로 주소와 IP를 연결해주어야 합니다. 

탄력적 IP를 A 레코드로 연결합니다. 

 

 

8. Letsencrypt 이용하여 https 접근 가능하도록 인증서 발급하고 연결하기

Letsencrypt 발급을 위해선 nginx를 꺼야합니다. systemctl stop nginx 명령어 혹은 위의 stop.sh를 실행하여 nginx를 끕니다.

 

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto

Certbot-auto 설치하기

 

위의 명령어를 입력하면 위의 nginx default 파일에서 설정했던 server_name대로 인증서가 발급되어 있습니다.

다시 vi /etc/nginx/sites-available/default 들어가보면 자동으로 ssl 설정이 되어 있음을 확인할 수 있습니다. 

 

systemctl restart nginx 명령어 혹은 위의 restart.sh를 실행하여 nginx를 재실행하고, https 주소로 웹사이트를 입력하여 https 로 접근이 가능해졌는지 테스트합니다. 

 

9. http를 https로 redirect 설정하기

원할 경우 nginx default 파일에서 http로 접속한 경우 자동으로 https로 변환되도록 만들 수 있습니다. 

vi /etc/nginx/sites-available/default 파일 맨 하단에 있는 코드를 아래와 같이 수정하면 됩니다. 

server {
	listen 80;
    listen [::]:80;
    
    server_name www.website.com;
    
    return 301 https://$host$request_uri;
}

 

정리하면, 

1. AWS EC2 인스턴스를 생성합니다.

2. 탄력적 IP를 연결합니다.

3. 보안그룹 인바운드 / 아웃바운드 규칙을 설정합니다.

4. 프로젝트 가져오고 세팅하기

5. PM2 설치 및 실행

6. nginx 설정하기 (proxy 경로 설정)

7. Router53으로 주소 연결하기

8. Letsencrypt 이용하여 https 접근 가능하도록 인증서 발급하고 연결하기

9. http를 https로 redirect 설정하기

위의 9가지 과정을 거쳐 Node 앱을 AWS EC2로 호스팅하는 데 성공하였습니다!

 

 

 

댓글