100%를 한번에 바꾸는건 어려워도 1%를 100번 바꾸는건 쉽다.

생각정리 자세히보기

개발/Node.js(Express)

[Node.js] EC2에 Express APP 배포하기

dc-choi 2022. 3. 2. 02:34
반응형

안녕하세요! 최근에 사이드 프로젝트를 진행하면서, 배포를 진행했습니다!

배포과정이 참 쉽지않았지만, 처음부터 끝까지 그 과정을 다 끝내고 다니 뿌듯했습니다.

그 과정을 자세하게 서술해보겠습니다.

EC2 인스턴스 생성

 

먼저, AWS 계정을 만들고 인스턴스를 생성해야합니다. 계정은 생성했다는 전제하로 설명드리겠습니다.

 

계정을 생성하고 들어가면 인스턴스 시작 버튼을 누릅니다.

인스턴스 시작을 누르고 넘어가면 많은 운영체제들을 설치 할 수 있습니다. 저는 ubuntu 20.04 LTS 버전으로 진행했습니다. 취향에 따라 다른 운영체제를 선택하셔도 좋습니다.

 

다음은 인스턴스의 스펙을 설정하는 부분입니다. 저는 프리티어로 설정했습니다.

 

그 다음으로 넘어가면, 키 페어를 생성하는 화면으로 넘어가게 됩니다.

이 키 페어가 있어야만, 접속이 가능합니다. 이름을 정하고 다음으로 넘어갑니다.

 

인스턴스를 생성하고나면, 홈 화면에 ip주소가 나오게됩니다.

키페어와 함께 인스턴스에 접속을 해야합니다. 윈도우 환경에서는 접속이 불가능하니 putty나 WSL2의 우분투를 사용하셔야 합니다. 접속전 다운로드 받은 키 페어의 권한을 설정합니다.

chmod 400 node_server.pem

자기 자신외에 다른 유저가 키 페어 파일을 사용하지 못하도록 권한을 설정해줘야 합니다.

 

설정 후, ssh 접속을 합니다.

ssh -i "node_server.pem" ubuntu@${IP주소}

ssh 접속을 성공합니다.

 

 

보안그룹 규칙 편집

 

먼저 서버의 보안설정을 해야합니다. 포트를 설정하지않으면 웹 서비스를 정상적으로 운영하기 어려워집니다.

 

저는 서버와 DB를 같이 사용해야해서 다음 예시처럼 설정했습니다.

Node.js 설치

 

보안 설정을 다 마치고나면, 다음으로 필요한 패키지를 설치해야합니다.

apt를 통해서 node.js를 설치할 수 있지만, 최신버전을 설치해야하는 경우엔 다음 명령어를 사용합니다.

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

다음 명령어를 통해 nvm을 활성화 시킵니다. nvm이란 Node Version Manager라고 합니다.

. ~/.nvm/nvm.sh

활성화를 시킨 후, nvm을 통해 가장 최선 버전의 Node.js를 설치합니다.

nvm install node

Node.js가 정상적으로 설치가 되었는지 확인합니다.

node -e "console.log('Running Node.js ' + process.version)"

 

Mysql 설치

 

Node.js를 설치하면, Mysql도 ec2에 같이 설치해줍니다. RDS를 사용하는 방법도 있으나, 저는 ec2에 직접 설치하는 방식으로 진행하였습니다. apt를 이용해서 설치합니다.

sudo apt install mysql-server

설치를 완료했다면, 설치여부를 확인해야합니다.

dpkg -l | grep mysql-server

실행 여부를 확인하기 위해서는 포트가 열려있는지 확인해야합니다.

netstat라는 명령어로 확인을 하는데, 만약 실행이 되지않는다면, 먼저 패키지를 설치합니다.

sudo apt install net-tools
netstat -na | grep mysql

mysql이 정상적으로 실행되는것을 확인했습니다.

 

Mysql 세부 설정

 

Mysql이 외부 서버와 통신하기 위해서 설정을 변경합니다.

mysql.conf.d 디렉토리로 이동하여 mysqld.cnf 파일을 수정해야합니다.

cd /etc/mysql/mysql.conf.d
sudo vi mysqld.cnf

mysql의 설정파일 부분을 다음 예시처럼 변경합니다.

 

bind-address를 127.0.0.1 => 0.0.0.0 으로 변경

mysqlx-bind-address를 127.0.0.1 => 0.0.0.0 으로 변경

Mysql에 접속해서 접속 계정을 생성해줘야 합니다.

로컬에서는 보통 root를 이용해서 개발을 하지만, 실제 서버환경에서는 root를 사용하면 보안에 취약합니다.

Mysql에 접속합니다.

sudo mysql

외부 접속 계정 생성, 권한 부여를 합니다.

create user '계정이름'@'%' identified by '패스워드';

grant all privileges on *.* to '계정이름'@'%' with grant option;

계정이름뒤에 %를 붙이게 되면 다른 외부에서도 얼마든지 접근이 가능하다는 의미입니다.

 

정상적으로 계정이 생성되었는지 확인합니다.

use mysql;

select user, host from user;

정상적으로 계정이 생성되었음을 확인합니다.

 

DB를 편리하게 사용하기 위해, DBeaver를 사용합니다.

host와 설정한 계정과 패스워드를 입력하고 접속을 확인합니다.

정상적으로 접속이 되는것을 확인합니다.

 

소스코드 가져오기

 

저는 소스관리를 Git으로 하기때문에 GitHub에 있는 소스코드를 가져옵니다.

git clone git@github.com:dc-choi/Attendance.git

프로젝트의 패키지를 설치합니다.

npm install

만약 .env파일도 추가해야한다면, .env 파일도 vi를 통해 생성해야합니다.

프로젝트 관리를 위해 DB의 설정을 .env파일에 두어서 설정했습니다.

vi .env
# Server Port
PORT=8080
# Connect DataBase
MYSQL_USERNAME=설정한 DB 계정
MYSQL_PASSWORD=설정한 DB PW
MYSQL_DATABASE=접속해야하는 DB 이름
MYSQL_HOST=AWS에서 프라이빗이라고 하는 부분의 IP
MYSQL_DIALECT=mysql

 

pm2 사용하기

 

Node.js 서버를 실행시켜도, EC2의 터미널을 닫게되면 서버가 다운되는 현상이 있었습니다.

그래서 백그라운드로 돌리기 위해 pm2를 사용하게 되었습니다.

 

npm install -g pm2

pm2를 사용하게 되면, 시작, 상태, 종료는 다음과 같습니다.

pm2 start {실행파일} --name {프로세스 이름}

pm2 list

pm2 stop {프로세스 이름}

pm2 명령어를 통해 서버를 띄웁니다.

 

 

포트 Redirect

 

마지막으로 저는 서버를 8080 포트에 띄웠습니다. 보통 웹 서버는 80번에 띄우는게 보통입니다.

8080으로 포트포워딩을 하지않아도 접속이 가능하게 Redirect를 설정했습니다.

 

인스턴스에서 아래 명령어를 사용합니다.

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

확인을 하려면 다음 명령어를 사용합니다.

sudo iptables -t nat -L --line-numbers

 

 

모든 설정을 마친다음, 정상적으로 프로그램이 동작하는것을 확인합니다.

배포를 하면서 엄청 많이 삽질을 하기도 했지만 무사히 끝내서 정말 다행이였습니다.

프로젝트를 진행하면서 AWS에 대해서 더 알아봐야겠다는 생각이 들었습니다.

 

읽기 힘든 글 끝까지 읽어주셔서 감사합니다.

 

참고자료:

https://mirae-kim.tistory.com/73

https://ookm1020.tistory.com/4

https://saegeullee.github.io/nodejs/deploy-nodejs-server-to-aws-ec2#db-%EA%B5%AC%EC%B6%95

https://artiiicy.tistory.com/12

https://hellominchan.tistory.com/11

https://docs.aws.amazon.com/ko_kr/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html

반응형