AWS와 Ubuntu를 사용하여 Nginx reverse-proxy와 pm2로 nodejs 프로젝트 무중단 서비스 만들기

Junyeong Fred Kim·2022년 3월 15일
2

⛏ 이 글은 구글 검색을 통하여 삽질 후, 정리한 내용이 담겨있습니다. ⛏
최대한 저 같은 삽질을 하지 않기를 바라며..(생각보다 쉬워서 시간 아까워 하는 중.)

준비물

  • 혹시, 안되더라도 저를 욕하지 않는 태도
  • AWS 계정
  • 리눅스 환경에 대한 조금의 지식
  • ssh 클라이언트 (iTerm2 권장)
  • Node.js에 대한 지식

왜 리버스 프록시인가?

  1. 로드 밸런싱을 사용하여 더 빠른 서버를 만들 수 있습니다.
  2. 쉬운 log 작성과 관리 : nginx 설정에서 access_log 같은 인수를 하나 추가하는 것만으로도 쉽게 로그를 작성할 수 있습니다.
  3. 보안 : 클라이언트에서 서버에 접속 할때, 8000와 같은 포트가 아니라, nginx의 80번 포트로 접속할 수 있어 직접적인 접근이 불가능합니다.
  4. 캐쉬 사용 : css나 js의 정적인 파일을 호스팅 할 때, 캐쉬를 사용해 더 나은 성능을 보여줄 수도 있습니다.

1. 인스턴스 만들기

우측 상단에 보이는 Launch instances 버튼을 클릭하여 인스턴스를 생성합니다.

그럼 위와 같은 화면이 보이게됩니다. 우리는 ubuntu로 서버를 만들 것이기 때문에, Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - ami-07ebfd5b3428b6f4d (64비트 x86) / ami-0400a1104d5b9caa1 (64비트 Arm) 옆에 있는 선택 버튼을 클릭 합니다.

선택 버튼을 누르면, 인스턴스 유형 선택으로 넘어가게 되는데, 프리티어 사용 가능이라는 초록색 뱃지가 붙은 t2.micro를 선택합니다.

다음으로 상단에 보시면 6.보안 그룹 구성이라는 버튼이 있는데, 그 버튼을 눌러주시면 아래와 같은 화면이 나타나게 됩니다.

여기서 화면에 있는 것처럼 규칙을 추가해주세요.
추가했다면, 우측 하단에 있는 검토 및 시작이라는 버튼을 눌러 생성을 진행해주세요.

그럼 다음과 같은 모달 창이 뜨게 됩니다. 셀렉트 박스에서 새 키 페어 생성를 선택하시고, 키 페어 이름은 원하는 이름을 입력하여 인스턴스 시작을 누르기 전에 꼭 키 페어 다운로드 버튼을 눌러주세요.

키 페어 다운로드 버튼을 누르시게 되면, 위와 같이 지정한 이름.pem의 파일이 다운로드 되게 됩니다.

이 키페어가 없으면 생성한 인스턴스에 접근이 불가합니다.
반드시 신뢰할만한 저장 장치에 추가로 백업을 해주세요.

그리고 인스턴스 시작 버튼을 눌러주셨다면, 보안 그룹 구성에서 각 포트에 대한 설명을 똑바로 작성하라고 에러가 나올 것입니다..... 설명 글에 대해 띄어쓰기 등 여러가지 문자가 제한되어있네요.

설명을 에러 문구에 맞게 작성 혹은 빈칸으로 해주시고, 다시 인스턴스 시작을 눌러주세요.

그럼 인스턴스가 잘 생성되어있는 것을 확인할 수 있습니다. 인스턴스 상태가 running인지 확인 후, ssh 접속을 준비하겠습니다.

2. ssh를 사용하여 인스턴스에 접속하기

iTerm2를 실행시키고, 다음과 같이 입력합니다.

$ ssh -i (키 페어가 위치한 경로) ubuntu@(여러분 인스턴스의 퍼블릭 DNS)

접속을 한다면 혹시, 아래와 같이 permission 관련 에러가 나올 수 있습니다.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/이름/.ssh/TEST.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/이름/.ssh/TEST.pem": bad permissions
ubuntu@ec2-52-15-83-94.us-east-2.compute.amazonaws.com: Permission denied (publickey).

당황하지 마시고 아래와 같이 터미널에 입력해보세요.

$ chmod 400 (여러분의 키 페어가 위치한 경로)

그리고 다시 아래와 같이 입력을 하면

$ ssh -i (키 페어가 위치한 경로) ubuntu@(여러분 인스턴스의 퍼블릭 DNS)

잘 접속이 되는 것을 확인할 수 있습니다.

3. Ubuntu 기본 설정 & nginx / Node.JS 설치

먼저, 아래와 같은 커맨드를 입력하여 기본적인 업데이트를 해보도록 합시다.

sudo apt-get update
sudo apt-get upgrade -y

그 다음에는, ngnix를 설치해보도록 합시다.

sudo apt-get install nginx 

ngnix가 잘 설치 되었는지 확인해보도록 하겠습니다.

sudo service nginx start

sudo service nginx start 명령어를 입력 후, 1초 정도 있다가 위의 이미지와 같이 아무일이 없으면 정상적으로 설치가 된 것입니다.

다시 AWS 인스턴스 콘솔로 돌아가 ipv4 퍼블릭 ip 부분에 있는 브라우저 창에 IP를 입력해 주시면. 이런식으로 nginx 서버에 접속을 할 수 있습니다!

이제 Node.js를 설치해보도록 하겠습니다.
CLI에 다음과 같이 명령어를 입력할게요.

curl -sL https://deb.nodesource.com/setup_13.x | sudo -E bash -
sudo apt-get install -y nodejs

설치가 잘 되었는지 확인하려면 아래와 같이 입력!

node -v
// v13.14.0
npm -v
// 6.14.4

그리고 추가적으로 pm2라는 프로세스 매니저를 설치해보도록 할게요.

sudo npm install -g pm2

Node.JS와 pm2의 설치가 완료되었다면, 이제 Node.js 서버를 실행시켜보도록 하겠습니다.

4. Node.js 서버 실행시키기

다음과 같은 커맨드를 실행하여,디렉토리(자유롭게 지어주셔도 됩니다)를 만들고, 그 폴더 안으로 이동해주세요.

cd ~
mkdir nodejs
cd nodejs

이제 여기에 Koa.JS라는 웹서버 라이브러리를 설치해볼게요.

npm install koa

이제 index.js 라는 파일을 만들어서 아래와 같이 입력해주세요!

vi index.js

index.js

const Koa = require('koa');
const app = new Koa();

app.use(ctx => {
    ctx.body = 'Hello Koa';
});

app.listen(8000, () => {
    console.log('server is listening to port 8000');
});

vim의 경우 i를 누르면 insert 기능이 활성화되어 코드를 작성할 수 있고, 다 작성하셨다면 ESC버튼을 입력하고 :wq를 입력하면 저장 후 나올 수 있습니다.

이제 pm2를 실행시켜 Node.js 서버를 열어볼 차례입니다.
터미널에 아래와 같이 입력해주세요.

pm2 start index.js

그러면 이런식으로 pm2를 사용하여 nodejs 서버가 열리게 됩니다.
ip에 :8000번 포트를 추가하여 한번 접속해 봅시다.

잘 열린 것을 확인할 수 있습니다.
이제 대망의 Nginx Reverse Proxy를 설정해보도록 하겠습니다.

5. Nginx Reverse-Proxy 설정하기

다시 터미널로 돌아와 아래의 명령어를 입력해보도록 하겠습니다.

cd /etc/nginx/sites-enabled

ls를 입력하면 아래와 default라는 파일이 보이는데, sudo rm default라고 입력해 다시 만들고 수정해보도록 하겠습니다.

ls
// default
sudo rm default
sudo vi default

vim 텍스트 에디터를 열어 아래와 같이 입력할게요.

server {
        listen 80;
        listen [::]:80;

        access_log /var/log/nginx/reverse-access.log;
        error_log /var/log/nginx/reverse-error.log;

        location / {
                    proxy_pass http://127.0.0.1:8000;
  }
}

마찬가지로 i를 입력하면 텍스트를 입력할 수 있고, 모두 작성 후 ESC를 누른 후 :wq를 입력하시면 vim 텍스트 에디터를 저장 후, 나올 수 있습니다.

작성한 코드가 정상적으로 입력하였는지 확인하기 위해 아래의 명령어를 입력해주세요.
아래와 같이 나온다면 모든 것이 잘 작동합니다!

sudo nginx -t
// nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
// nginx: configuration file /etc/nginx/nginx.conf test is successful

그럼 코드를 새로 작성하였기 때문에 nginx를 재부팅 해볼게요.

sudo service nginx restart

마찬가지로 아무일이 일어나지 않는다면, 성공적으로 재부팅이 된 것입니다.

그렇다면 이제 8000 포트를 제외하고 브라우저에 ipv4 퍼블릭 ip만 입력해볼까요?

보시는 것과 같이 8000번 포트가 없는데도 Hello Koa라는 텍스트가 보입니다!
이제 모든 중요한 작업들은 끝났습니다.

6. 8000번 포트 다시 닫기

인스턴스를 생성할 때, Node.js에 접속하기 위해 8000번 포트를 열어두었던 것을 기억하시나요?
이제 더이상 8000번 포트를 사용하지 않아도 되기 때문에, 보안을 위해서 8000번 포트를 닫아줄게요!

다시 인스턴스 세부정보로 접속하면 아래와 같은 화면을 보게 됩니다.

하단에 있는 보안 탭을 클릭하여, 보안 탭 아래에 있는 보안그룹 버튼을 누르신 후, 인바운드 규칙 편집 이라는 버튼을 눌러주세요.

그럼 위와 같은 화면을 보시게 될텐데, 여기서 추가해주었던 8000번 포트를 삭제 버튼을 통해 삭제해주시고, 규칙 저장 버튼을 눌러주세요.

이제 8000번 포트가 삭제되었습니다.
이로 인해 모든 설정이 끝났습니다.

profile
기억보다 기록

0개의 댓글