본문 바로가기

블록체인_9기/💚 Node.js

42강_230601_AWS(웹 서버 배포, 도메인, Https 설정, nvm, Nginx)

728x90

 

 

 


nvm(Node version Manager)

  • node.js의 버전 관리 매니저로 시스템에 여러 개의 node.js를 설치하고 사용할 버전을 쉽게 전환할 수 있게 도와주는 shell script이다.
  • node.js를 설치하고 다른 버전을 설치할 때 삭제하고 다시 설치할 필요없이 버전 관리가 편리하다.
  • 원하는 버전을 설치받고 바로 스위치가 가능하다.

 

 

 


도메인을 설정하여 웹 서버를 배포하자(HTTPS)

 

 

Ⅰ. AWS에서 인스턴스 생성

  1. AWS 접속 > EC2 클릭 > 좌측 카테고리에서 인스턴스 선택 > 좌측 상단의 인스턴스 시작 클릭
  2. 이름 및 태그 - 임의로 인스턴스의 이름을 설정
  3. 애플리케이션 및 OS 이미지
    1. Quick Start - Ubuntu
    2. 프리티어로 설정한다 - 무료로 사용하기 위해서
  4. 키 페어 - 원하는 키 페어를 선태하거나 새로운 키 페어를 생성한다.
    1. 키 페어 생성 - 새 키페어 생성 클릭 > 키 페어 이름은 임의의 값으로 입력한다. > 키 페어 유형 RSA > 프라이빗 키 파일 형식 .ppm > 하단의 키 페어 생성 을 클릭하여 키 페어를 생성한다.
  5. 네트워크 설정 - 좌측 상단의 편집 버튼을 클릭하여 편집을 진행한다.
    1. 인바운드 보안 그룹 규칙 - 하단의 보안 그룹 규칙 추가 를 클릭하여 보안 그룹을 추가할 수 있는 탭을 열고 새로운 보안 규칙을 추가한다.
      1. 유형 HTTP / 원본 0.0.0.0/0
      2. 유형 HTTPS / 원본 0.0.0.0/0
      3. 유형 MYSQL/Aurora / 원본 0.0.0.0/0
      4. 유형 사용자 지정 TCP / 원본 0.0.0.0/0 / 포트범위 (연결할 프로젝트가 대기중인 포트번호)
  6. 가장 하단의 인스턴스 시작 을 눌러 인스턴스를 생성 및 실행을 시작한다.

 

Ⅱ. EC2로 인스턴스에 mysql, git프로젝트 등을 연결한다.

✏️ mysql 연결

  1. 가장 먼저 업데이트를 진행한다.
    1. sudo apt-get update
  2. mysql을 설치한다.
    1. sudo apt-get install mysql-server
  3. sudo 권한으로 mysql에 접속한다.
    1. sudo mysql -u root -p
    2. 접속이 완료되면, 입력 창이 mysql>  로 변경된다.
  4. mysql에 데이터베이스를 생성한다.
    1. create database 생성할 데이터베이스 이름;
      1. mysql에서는 끝에 세미콜론(;)을 찍어줘야 한다.
  5. 데이터베이스 목록을 확인한다.
    1. show databases;
  6. 데이터베이스에서 사용할 유저를 생성한다.
    1. create user '유저 이름 '@ '%' 'identified by '사용할 비밀번호';
  7. 생성한 유저에게 권한을 설정한다.
    1. grant all on 데이터베이스 이름.(데이터 베이스이름 뒤에 점)* to '유저이름'@'%';
      1. 해당하는 데이터베이스의 모든 테이블에 접근이 가능하다.
  8. 유저의 권한을 확인한다.
    1. show grants for '유저 이름';
  9. mysql의 외부 접속을 허용하기 위해 모든 아이피를 허용하도록 설정을 변경한다.
    1. 아이피 설정 파일이 있는 폴더에 접근한다.
      1. sudo /etc/mysql/mysql.conf.d
    2. 아이피 설정을 할 수 있는 파일을 vi 를 이용하여 열어준다.
      1. sudo vi mysqld.cnf
    3. 열린 파일에서 bind-address 목록을 찾아 값을 0.0.0.0으로 수정 후 저장한다.
      1. 열린 파일에서 목록을 찾기 위해서 마우스 휠이 아닌 키보드 방향키로 움직인다.
      2. 수정을 진행하기 위해서 i 를 눌러 수정모드로 진입한다.
      3. 내용을 수정하고 나서 esc를 눌러 수정모드에서 나간다.
      4. 수정한 내용을 저장하고 mysqld.cnf 파일을 나가기 위해서 :wq!를 입력한다.

 

Ⅲ. mysql 워크벤치에 새로운 connection을 생성한다.

  1. 커넥션 생성 팝업에서 name, Hostname, Username, Password 등의 내용을 입력한다.
    1. name: 임의의 값으로 입력.
    2. Hostname: aws의 인스턴스에서 "퍼블릭 IPv4 DNS"의 주소를 복사하여 넣는다.
    3. Username: mysql을 연결하여 생성한 이름을 넣는다. 지금의 경우는  "testadmin"
    4. Password: 'Store in Vault ...' 을 클릭하여 mysql 생성 후 입력한 비밀번호를 입력해준다. 지금의 경우 "1234"
    5. 'Test Connection'을 클릭하여 생성가능 여부를 확인하고 'OK'를 눌러 생성한다. 

Ⅳ. git 프로젝트를 연결한다.

✏️ git 연결

  1. 깃을 설치한다.
    1. git init
  2. 깃의 레포스토리지를 연결한다.
    1. git remote add origin 깃 레퍼스토리지 주소 (HTTP)
  3. 연결한 레포스토리에 등록된 파일들을 내려받는다.
    1. git pull origin master
  4. 깃이 올린 내용이 업데이트 되도록 한다.
    1. sudo apt-get update
  5. package.json의 모듈을 받기 위해, npm 을 인스톨 한다.
    1. 첫 번째 시도에서는 인스톨 하지 않아도 npm이 동작했지만, 두 번째 시도에서 npm을 인스톨 받으라고 했기 때문에 설치를 진행하여 npm을 동작하였다.
    2. sudo apt install npm 
  6. 깃의 package.json에 등록되어 있는 모듈을 내려받는다.
    1. npm i
  7. pm2를 설치하여 서버가 끊기지 않도록 백그라운드 환경에서 동작할 수 있도록한다.
    1. pm2 설치
      1. npm i pm2
    2. pm2로 서버를 열도록 package.json 파일을 열어 실행 컨텍스트를 수정
      1. "start": "pm2 start app.js"

Ⅴ. nvm을 설치하여 적용시킨다.

  1. curl 명령어를 사용하여 num을 설치한다. 해당 명령어를 입력하면 nodejs의 원하는 버전을 설치하고 사용할 수 있다.
    1. curl: 커맨드 라인에서 URL을 통해 데이터를 전송하고 받는 도구
    2. -o- 옵션: 다운로드한 내용을 표준 출력으로 보내라는 의미
    3. curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
  2. 소스파일을 적용시킨다.
    1. source ~/.bashrc
  3. 전체 목록을 확인한다.
    1. nvm list-remote
  4. 원하는 node.js의 버전을 선택하여 설치한다.
    1. nvm install 16(여기에 숫자 버전)

 

 


👩‍🏫

Nginx

  • 동시접속 처리에 특화된 웹 서버 프로그램이다.
    • 동시접속자(약 700명) 이상이라면 서버를 증설하거나 Nginx 환경을 권장한다고 한다.\
  • Nginx를 사용해서 프록시를 설정할 수 있다.

 

프록시 서버

  • 프록시 서버는 클라이언트에서 서버로 접속을 할 때 직접적으로 접속하지 않고 중간에 대신 전달해주는 서버를 의미한다.
    • 통신을 할 때 중간에서 대신 통신을 해주는 역할을 수행한다.
  • 프록시 서버를 사용하는 가장 큰 이유는 보안이라고 볼 수 있다.
    • 서버의 ip주소를 숨길 수 있기 때문이다.

 

 

프록시는 위치에 따라 포워드 프록시와 리버스 프록시로 구분된다.

포워드 프록시(forward proxy server)

출처: https://losskatsu.github.io/it-infra/reverse-proxy/#1-%ED%94%84%EB%A1%9D%EC%8B%9Cproxy-%EC%84%9C%EB%B2%84%EB%9E%80

  • 포워드 프록시 서버는 상단의 그림처럼 클라이언트 앞에 놓여있다.
  • 클라이언트가 인터넷 웹 서버에 요청을 보내면 중간에서 그 요청을 프록시 서버가 가로챈다.
  • 프록시 서버는 해당 요청을 웹 서버에게 다시 보내고 웹 서버에게 받은 응답을 다시 클라이언트에게 전달한다.

사용하는 이유?

  • 기업과 기관은 해당 기간에 속한 사람들의 제한적인 인터넷 사용을 위해 방화벽을 사용하는데 이런 제한을 위해 사용
    • 기관에 속한 유저가 특정 컨텐츠(사이트 등)에 접근하는 것을 방지하는데 사용한다.
  • 프록시 서버를 사용하면 유저의 정체를 숨길 수 있다.
    • 프록시 서버를 사용하면 ip를 역추적해도 정체를 파악하기 어려워 익명성을 보장한다.

 

리버스 프록시(reverse proxy server)

출처: https://losskatsu.github.io/it-infra/reverse-proxy/#2-%ED%8F%AC%EC%9B%8C%EB%93%9C-%ED%94%84%EB%A1%9D%EC%8B%9Cforward-%EC%84%9C%EB%B2%84%EB%9E%80

  • 프록시 서버가 웹 서버의 앞에 위치한다.
  • 클라이언트가 서버에 요청을 보내면 리버스 프록시가 호출되고 리버스 프록시는 서버에게 요청해서 서버의 응답을 받게된다.

사용하는 이유?

  • 리버스 프록시 서버는 로드 밸런싱(load balancing)에 사용된다.
    • 유명한 웹 사이트는 하루에도 수백만명이 방문한다. 그리고 그러한 대량의 트래픽을 하나의 싱글 서버로 감당해 내기 어렵다.
    • 하지만 리버스 프록시 서버를 여러개의 서버 앞에 두면 특정 서버가 과부화 되지 않게 로드밸런싱이 가능하다.
  • 리버스 프록시를 사용하면 본래 서버의 IP 주소를 노출시킬 필요가 없다.
    • 따라서 해커들의 DDoS 공격과 같은 공격을 막는데 유용하다.
      • 대신 CDN과 같은 리버스 프록시 서버가 공격의 타겟이 될 수 있다.
  • 리버스 프록시 서버에는 성능 향상을 위해 캐시 데이터를 저장할 수 있다.
    • 만약 어떤 한국에 있는 유저가 미국에 웹서버를 두고 있는 사이트에 접속할때, 리버스 프록시 서버가 한국에 있다고 해봅시다.
      • 그러면 한국에 있는 유저는 한국에 있는 리버스 프록시 서버와 통신합니다.
      • 따라서 리버스 프록시 서버에 캐싱되어 있는 데이터를 사용할 경우에는 더 빠른 성능을 보여줄수 있는 것입니다.
  • 마지막으로 SSL 암호화에 좋다.
    • 본래 서버가 클라이언트들과 통신을 할때 SSL(or TSL)로 암호화, 복호화를 할 경우 많은 비용이 발생한다.
    • 그러나 리버스 프록시를 사용하면 들어오는 요청을 모두 복호화하고 나가는 응답을 암호화해주므로 클라이언트와 안전한 통신을 할수 있으며 본래 서버의 부담을 줄여준다.

 

Ⅵ. Nginx로 리버스 프록시를 적용시킨다.

  1. aws 인스턴스에서 nginx를 설치한다.
    1. sudo apt install nginx
  2. nginx를 시작한다.
    1. sudo service nginx start
  3. nginx의 상태를 확인한다.
    1. sudo service nginx status
  4. nginx를 종료한다.
    1. sudo service nginx stop
  5. 웹 사이트 호스팅에 대한 설정 값을 변경해야 하므로 해당 설정이 있는 default파일에 접근하여 수정을 진행한다.
    1. default 파일 접근
      1. cd /etc/nginx/sites-enabled/
    2. default 파일 수정하기 위해 열어준다.
      1. sudo vi default
    3. 열린 파일을 수정한다.
      1. try_files 을 찾아 해당 줄을 주석 처리한다. - 코드 앞에 #을 추가하면 주석처리 된다.
        1. # try_files $uri $uri/ =404;
      2. 해당 내용을 try_files 아래에 추가해준다.
        1. proxy_set_header HOST $host;
          1. 요청이 들어온 브라우저의 host내용을 넘겨준다는 뜻
        2. proxy_pass http://127.0.0.1:7777(서버가 대기 중인 포트번호 입력);
          1. proxy_pass 80으로 포트를 듣고 들어온 요청을 7777포트로 전달하겠다는 뜻
        3. proxy_redirect off;
          1. SPA일 경우 redirect 없애겠다는 의미. SPA가 아니면 굳이 써줄 필요는 없다.
            1. SPA는 단일 페이지 어플리케이션을 의미한다.
      3. 열려있는 default 파일을 저장 후 종료한다.
        1. :wq!
    4. 수정이 완료되었으면 문법적 요류를 체크해 준다.
      1. sudo nginx -t
    5. 원래 경로로 이동한다.
      1. cd /home/ubuntu/
    6. nginx를 재 실행한다.
      1. sudo service nginx restart

 

Ⅶ. 탄력적 IP 주소를 도메인으로 교체하기 위해서 탄력적 IP 주소를 할당한다.

  1. AWS의 EC2에서 좌측 카테고리의 네트워크 및 보안 > 탄력적 IP > 우측 상단에 탄력적 IP 주소 할당 을 클릭한다.
  2. 초기 설정 값 그대로 하단의 할당 버튼을 눌러 할당한다.
  3. 할당 된 IPv4주소 열에서 원하는 IP를 클릭 > 우측 상단에 탄력적 IP 주소 연결 
  4. 인스턴스에서 연결할 인스턴스를 선택 > 프라이빗 IP 주소를 클릭하여 자동으로 뜨는 주소를 넣어준다. > 하단의 연결을 클릭하여 IP 주소를 연결한다.

 

Ⅷ. AWS의 route 53을 이용하여 도메인 이름을 등록한다.

❗ 먼저, 교체될 도메인이 준비되어 있어야 한다!

  • 나는 이번 시간에 "가비아"에서 도메인을 구입하였다.

레코드

  • DNS 레코드: 도메인의 이름과 관련된 정보를 나타내는 데이터이다.
  • NS(네임서버): 인터넷에서 도메인을 ip 주소로 변환하는 역할을 담당한다.
    • 도메인을 입력하면 네임서버에게 도메인 ip주소를 요청해서 웹 사이트에 접근할 수 있도록 한다.
  • A 레코드: 도메인 이름을 v4주소로 매핑한다.
  • CNAME 레코드: 서브 도메인으로 설정해준다.
    • 예. www. testURL.com로 접속했을 때 testURL.com로 이동하게끔 해주는 개념이다.

 

  1. AWS 페이지 상단의 검색창route 53 검색하여 접속 (추후, 상단 서비스에서 바로 확인할 수 있다.) > 좌측 카테고리에서 호스팅 영역 클릭 > 상단의 호스팅 영역 생성 클릭
  2. 도메인 이름 영역 - 도메인 사이트에서 구입한 도메인을 입력 (예. testURL.com) > 하단의 호스팅 영역 생성 클릭
  3. 생성한 도메인 이름을 클릭하면 기본적으로 2개의 레코드가 확인된다. 그 중 NS유형의 값/트래픽 라우팅 대상에 입력되어 있는 값을 도메인 사이트로 이동해서 호스팅의 네임서버로 추가해준다.
    1. aws에서 값/트래픽 라우팅 대상의 값은 예를 들어 ns-345 sdfjnd-56.net. 등의 값이 있는데 해당 값의 맨 마지막의 점(.)을 제외하고 도메인 사이트에 추가해야 한다.
    2. 도메인 사이트에서 이용중인 도메인의 관리를 클릭 > 네임서버 탭에서 설정 클릭 > 원래 저장되어 있던 값들은 지우고 aws의 값으로 추가해준다.
      1. 나의 경우에는 값/트래픽 라우팅 대상의 값이 총 4개가 있었는데 해당 값을 순차적으로 입력해주어야 한다고 들었다.
  4. aws의 연결을 원하는 도메인을 클릭 > 레코드 탭의 레코드 생성 클릭 
  5. 두 개의 레코드를 등록한다.
    1. 레코드 유형 -  A / 값 - 탄력적 IP 주소 > 하단의 레코드 생성 클릭
    2. 레코드 이름 - www / 레코드 유형 - CNAME / 값 - 도메인주소 입력(예. testURL.com) > 하단의 레코드 생성 클릭

 

Ⅸ. HTTPS를 설정하여 보안이슈를 해결한다.

  • 도메인 연결에서 이슈가 터져 해당 부분 추후 수정예정
// https로 보안이슈 해결
// 검증된 사이트라는 것이고
// https를 요청할 때 인증서를 발급받아서 인증을 요청하는데
// https설정
// 배포한 서버에 https를 설정해서 보안 이슈를 해결한다.
// 인증서를 발급받을 곳은 무료로 인증서를 3개월짜리 발급받을 것이다.
// 3개월마다 발급을 받으면 무제한으로 무료이용이 가능하다.
// 모질라 라는 곳에서 certbot이라는 친구를 사용해서
// https를 간편하게 설정할 수 있다.
// 3개울마다 우리가 직접 인증서를 재발급 받을 필요가 없이
// 알아서 3개월마다 재발급 받고 우리 메일로 알려준다.

// certbot: nginx랑도 호환이 좋고 간단하게 인증서 발급 갱신이 가능하다.
// https://certbot.eff.org/

// 설명대로 설치를 하자
// sudo snap install core
// sudo snap refresh core

// sudo snap install --classic certbot

// certbot 실행파일에 링크 설정
// sudo ln -s /snap/bin/certbot /usr/bin/certbot

// nginx관련 certbot 실행
// sudo certbot --nginx     => 도메인 작성(weeeji.site) 

// nginx에 default파일을 수정
// cd /etc/nginx/sites-enabled/에 있는 파일

// location 위에
// server_name 도메인/

// 문법 오류 확인
// sudo nginx -t

// 경로 원래 경로로 가자
// cd /home/ubuntu/

// nginx 재시작
// sudo service nginx restart

// 3깨월마다 재발급 해주는 명령어
// sudo certbot renew

// 인증서 재발급 체크
// 실제로 인증서를 갱신하지 않고 시뮬레이션으로 체크한다.
// 발급할 때 사전에 문제가 생길지 여부를 체크한다.
// sudo certbot renew --dry-run

 

728x90