• 시나리오
  1.  VScode 환경에서 테스트 시 문제 없이 진행
  2.  배포서버 (EC2 Ubuntu express 환경)에서 테스트 시 fetch is not defined 에러 발생

 

const fetch = require("node-fetch");
const Joi = require("joi");
const UserRepository = require("../repositories/users.repository");
const jwt = require("jsonwebtoken");

fetch 메소드를 사용하는 js파일에 패치 선언

 

npm install node-fetch@2

 

EC2 Ubuntu 서버 배포 파일에 위 명령어 실행 후 서버 재실행

 

조치 후 fetch 동작 확인

 

sudo certbot --nginx

Nginx SSL 설정 중 위 명령어 실행 시 발생 할 수 있는 에러.

 

sudo snap install certbot --classic
이후 

sudo apt-get install python3-certbot-nginx
설치 하지 않아 발생한다.

sudo snap install certbot --classic
설치 시 python이 같이 설치 되는데 nginx와 묶이지 않아 발생하는 것으로 보인다.

 

  • 결론
sudo snap install certbot --classic
sudo apt-get install python3-certbot-nginx

* ubuntu 18.03버전 이하는 sudo apt-get install python-certbot-nginx

 

  • 구성
  • express 2ea (EC2 Ubuntu)
  • nginx 1ea (EC2 Ubuntu)
  • 환경
  • OS : ubuntu20.04
  • Nginx : 1.18.0
  • 조건
  • express 2ea, nginx 1 같은 VPC
  • 가비아에서 도메인 구입 후 nginx IP와 매칭
  • 시나리오
  1. client 호출을 nginx 서버에서 받음.
  2. nginx 서버에서 express 서버로 로드 밸런싱
  3. 한 대의 express 서버 장애 시 다른 정상 express서버에서 서비스

  • Nginx Load Balancing
sudo apt update

sudo apt install nginx

sudo apt update

운영체제에서 사용 가능한 패키지들과 그 버전에 대한 정보를 업데이트하는 명령어

 

sudo apt install nginx

Nginx가 성공적으로 설치되면 nginx -v 커멘드로 확인할 수 있다.

 

nginx -v

 

sudo vi /etc/nginx/nginx.conf

 

/etc/nginx/conf.d 경로를 사용할 것이므로 /etc/nginx/sites-enabled/ 경로와 /etc/nginx/sites-available/ 경로에 defalut 파일이 있다면 삭제한다.

sudo rm -rf /etc/nginx/stites-available/default

디폴트 설정을 삭제하고

 

sudo vi /etc/nginx/conf.d/default.conf
upstream myserver {
        server 172.31.5.101:3000; 
        server 172.31.10.21:3000; 
}

server {
        listen 80;
        server_name your.domain.com;


      location / {
        proxy_pass http://myserver;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}

작성 후 저장.

upstream myserver {} ip 주소만 사용에 맞게 변경해주면 된다.   - 해당 시나리오 exrpess 내부 아이피 사용


  • SSL
sudo snap install certbot --classic

sudo apt-get install python3-certbot-nginx

 

ubuntu 18.03 이하 버전에선 python 설치.

sudo apt-get install python-certbot-nginx

 

sudo certbot --nginx

  1. 알림 받을 email 설정
  2. a
  3. y
  4. 도메인 주소

 

sudo vi /etc/nginx/conf.d/default.conf

certbot --nginx 후 default.conf를 확인하면 certbot이 ssl에 필요한 정보들을 자동으로 입력해준다.

 

sudo service nginx restart

ssl 적용 확인

 

도메인/express서버 기능 uri 호출 시 express서버에서 load balancing이 되는것을 확인 할 수 있다.


  • ssl 자동 갱신
sudo vi /etc/crontab

  • crontab 규칙

    * * * * *  유저 이름 명령어
    ┬ ┬ ┬ ┬ ┬
    │ │ │ │ └─ 요일 (0 - 6) (0:일요일, 1:월요일, 2:화요일, …, 6:토요일)
    │ │ │ └─ 월 (1 - 12)
    │ │ └─일 (1 - 31)
    │ └─ 시 (0 - 23)
    └─ 분 (0 - 59)

최하단 59 5 * * * service nginx reload 추가

sudo service cron restart

 

  • 시나리오 : nginx를 이용한 로드 밸런싱 구현
  • 필요 서버 : nginx 1ea, express 2ea

이번 포스팅은 기존 express 서버가 있고, express 서버 한 대를 추가하는 내용이다.

- 추가로 node 버전이 두 서버 안 맞는 경우가 있어 버전 통일도 진행.

 

  • EC2 설치

  • 프리티어로 사용할 것이기 때문에 ubuntu Server 22.04 LTS를 선택한다. 

  • 인스턴스 유형은 t2.micro
  • 키 페어는 만들어 둔 페어로 사용

 

  • 2대 이상 서버로 구축할 것이라면 서브넷, 보안그룹을 맞춰주는게 편한다.

  • 서브넷은 기존  ec2서버 서브넷이 ap-northeast-2a 로 되어있어 같이 맞춰준다.

  • 보안 그룹도 launch-wizard-1로 맞춰준다.

  • 8GiB 이상 필요하지 않아 기본값으로 만들었다. 30GiB까지 프리티어라고 한다.

  • 인스턴스 시작 버튼 클릭

 

 

  • 퍼블릭 IP를 확인하고 ec2에 접속한다. (여기선 git bash 사용)

 


  • node, npm 버전 맞추기

기존 코드 clone을 받아 npm i를 했다. read-shrinkwrap 에러가 발생한다.

이유는 lockfileVersion이 1, 이는 npm 버전이 6이하라는 것이다. 7부터 lockfileVersion 2로 변경

 

  • 우선 node와 npm을 지우자

sudo apt-get remove nodejs -y

sudo apt-get remove npm -y

 

  • 버전 확인해서 지워진것 확인해보고

node -v

npm -v

 

  • node 다시 설치

sudo apt install curl

curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -

(setup_숫자는 버전을 의미한다.)

sudo apt-get install node.js -y

 

  • 버전 확인

node -v

npm -v

 

'Infra > AWS' 카테고리의 다른 글

AWS EC2 생성 (ubuntu 프리티어)  (0) 2023.10.23
EC2 - S3 파일 복사  (1) 2023.10.23
AWS EC2 용량 추가 (EBS 볼륨 증설)  (1) 2023.10.23
AWS 탄력적 IP 할당 ( 퍼블릭 IP 고정 )  (0) 2023.10.23
AMI를 이용한 서버 복사  (1) 2023.10.23

데이터 타입의 종류

  • 기본형 primitive type
  • 숫자 number
  • 문자열 string
  • 불리언 boolean
  • null, undefined
  • ES6에서 추가된 symbol

 

  • 참조형 reference type
  • 객체 Object
  • 배열 Array
  • 함수 Fuction
  • 날짜 Date
  • 정규표현식 RegExp
  • ES6에서 추가된 Map, WeakMap, Set, WeakSet

 

기본형과 참조형을 구분하는 기준

  • 기본형(불변값) : 값이 담긴 주솟값을 바로 복제 
  • 참조형(가변값) : 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제

불변값과 가변값의 의미는 아래 예제를 통해 알아보자.

 

1
2
3
4
var a;
= 'abc';
 
var a = 'abc'; //변수 선언과 할당을 한 문장으로 표현 위 2줄 코드와 같다.
cs

'기본형' 여기선(string)의 선언과 데이터 할당에 대한 메모리 영역

 

-대괄호[]의 숫자는 코드 줄을 의미-

 

[1] var a; // var 예약어로 변수 a 선언

변수 영역에서 빈 공간(@1003)을 확보한다. 확보한 공간의 식별자를 a로 지정한다.

 

[2] = 'abc'; // 변수 a에 데이터 할당

데이터 영역의 빈공간(@5004)에 문자열 'abc'를 저장한다.

변수 영역에서 a라는 식별자를 검색한다(@1003)

앞서 저장한 문자열의 주소(@5004)를 @1003의 공간에 대입한다.

 

[4] var a = 'abc'; // 변수 선언과 할당을 한 문장으로 표현

 

위 예제와 같이 변수영역엔 식별자(a)와 값이 저장된 데이터 영역의 주소(@5004)가 저장된다. 이처럼 변수 영역과 데이터 영역을 분리하면 중복된 데이터에 대한 처리 효율이 높아진다.
기본형 데이터 타입이 불변값인 이유는 'abc' 문자열에 'def'를 추가한다면 'abc'가 저장된 공간에 'def'를 더하는 것이 아닌 새로운 공간(5005)에 'abcdef'를 저장하고 1003주소의 값은 (@5004) -> (@5005)로 변경된다. 이렇게 'abc'는 변하지 않는 성질을 띄고 있다.

 

불변값을 알아 봤으니 이제 가변값도 예제를 통해 알아보자.

 

1
2
3
4
var obj1 = {
    name : 'ohsung',
    age : 26
};
cs

'참조형' 객체의 선언과 데이터 할당에 대한 메모리 영역

 

[1] var obj1 = { // var 예약어로 변수 obj를 선언

변수 영역에서 빈 공간(@1003)을 확보한다. 확보한 공간의 식별자를 obj1로 지정한다.

 

[2] name : 'ohsung'

[3] age : 26

데이터 영역의 빈공간(@5001)에 데이터를 저장하려고 보니 여러 개의 프로퍼티로 이뤄진 데이터 그룹이다.

이 그룹 내부의 프로퍼티들을 저장하기 위해 별도의 변수 영역을 마련하고, 그 영역의 주소(@7103 ~ ?)를 @5001에 저장한다.

@7103 및 @7104에 각각 name과 age라는 프로퍼티 이름을 저장한다.

데이터 영역에서 'ohsung'을 @5003에 저장하고, 26을 @5004에 저장한다.

 

기본형 데이터와의 차이는 '객체의 변수(프로퍼티) 영역'이 별도로 존재한다는 점이다. 예제를 보면 객체가 별도로 할애한 영역은 변수 영역일 뿐 '데이터 영역'은 기존의 메모리 공간을 그대로 활용하고 있다. 데이터 영역에 저장된 값은 모두 불변값이다. 그러나 변수에는 다른 값을 대입할 수 있다. 바로 이부분에 참조형 데이터는 가변값이다라고 한다.

 

  • JS로 작성한 프로그램 = script

 

  • JS특징
  1. script는 HTML 안에서 작성 할 수 있다. (HTML을 불러올 때 자동으로 실행)
  2. '컴파일 없이' 문자 형태로 작성 및 실행 가능 (인터프리터)
  3. 브라우저, 서버 뿐 아니라 '자바스크립트 엔진' 프로그램이 들어 있는 모든 디바이스에서 동작한다.
  4. 메모리나 CPU 조작을 허용하지 않는다.
  5. 브라우저엔 자바스크립트 가상 머신이란 엔진이 내장되어 있다
  6. node.js 환경에선 파일을 읽거나 쓰고, 네트워크 요청을 수행한다.

 

  • JS 강점
  1. HTML/CSS 완전한 통합 가능
  2. 간단하게 일을 처리
  3. 모든 주요 브라우저 지원, 기본 언어로 사용됨

 

 

  • 브라우저 별 JS엔진
  • V8 - chrome
  • Chakra - IE, Edge
  • SquirrelFish - safari

 

  • 브라우저에서 할 수 있는 일
  1. HTML 추가, 수정하기
  2. 마우스 클릭이나 키보드 눌림과 같은 사용자 행동에 반응하기
  3. 네트워크를 통해 원격 서버에 요청을 보내기, 파일 다운로드, 업로드하기
  4. 쿠키를 가져오거나 설정하기
  5. 클라이언트 측에 데이터 저장

 

  • 브라우저에서 할 수 없는 일
  1. 사용자가 브라우저 창에 파일을 끌어다 두거나, <input> 태그를 통해 파일을 선택할 때 같은 특정 상황에서만 파일 접근을 허용한다.
  2. 도메인, 프로토콜, 포트가 다르다면 같은 브라우저 내 다른 탭과 창에서 서로의 정보를 공유하지 않는다.
  3. 위 제약 사항들은 모두 보안을 위해 만들어졌다.

 

브라우저에서의 자바스크립트

 

 

 

 

 

+ Recent posts