최근 컨테이너 기술기반의 도커가 주목받고 있습니다. 

기존의 서버 가상화 기술보다 자원관리 측면에서 효율이 더 좋기 때문인데요.

관심있으신 분들을 위해 제가 공부하고 있는 것들을 두서없이 나열해보고자 합니다!


아직 학기 중이라서 나중에 시간이 된다면 체계적으로 올려보도록 하겠습니다.


아래 URL을 따라 학습하였습니다!

1. 도커란?

2. 윈도우에서 도커 설치 가이드


* 아래 사진은 도커에서 Apache 이미지를 검색하고 다운 받는 것을 보여줍니다.


도입

SK Tech에서 교육과정을 이수하는 중 Nodejs 서버를 구축하게 되었는데요.

CRUD에 충실한 간단한 서버이지만, 단순 ec2 서버에서 AWS 아키텍처를 적용했을 떄 

  • 현재 서비스 구성의 제한(limit)이 어떻게 변하고
  • 부하의 허용치가 어떻게 변하고
  • 병목 지점이 있다면 해소되는지

를 측정하기 위해 서버 부하테스트를 진행하기로 했습니다.

테스트 도구

선택의 기준은 다음과 같습니다.

* 제 능력상 사용할 수 있는지

* 빠르게 사용가능한지

* 모니터링이 되는지

부하 테스트기

1. ApacheBench (http://httpd.apache.org/docs/2.2/en/programs/ab.html): 아파치에서 기본적으로 제공하는 기능으로 HTTP 웹서버의 성능을 측정할 때 자주 사용하는 도구이고, 간단하기 떄문에 사용해보도록 하겠습니다.

2. Goad (https://goad.io/): "AWS Lambda 를 활용하여 부하를 분산 생성하여 테스트를 수행하는 오픈 소스 툴로서 Go 언어로 개발 되었습니다. 실제 AWS 의 이점과 AWS Lambda 의 강력함을 잘 활용한 툴 입니다." 라고 설명이 되어 있지만, 명확한 DOCUMENT도 없고 기술지원이 잘 되고 있지 않아서, 제 능력상 배제하였습니다. 

3. JMeter (http://jmeter.apache.org/): 1998 년 부터 시작된 프로젝트로서 오랫동안 기능 강화를 지속해오고 있는 Java 기반의 부하 테스트 툴 입니다. HTTP 뿐만 아니라 다양한 프로토콜을 지원하며, 많은 기능을 가진 GUI 를 제공 합니다. 

모니터링 도구

1. AWS EC2 상에 서버가 있기 때문에 Elastic Search를 사용할 것입니다

Elastic Search : Amazon Elasticsearch Service를 사용하면 손쉽게 Elasticsearch를 배포, 운영 및 확장하여 로그 분석, 전체 텍스트 검색, 애플리케이션 모니터링 등을 수행할 수 있습니다. Amazon Elasticsearch Service는 Elasticsearch의 간편한 API 및 실시간 기능과 더불어 프로덕션 워크로드에 필요한 가용성, 확장성, 보안성을 제공하는 완전 관리형 서비스입니다.

추가 소프트웨어를 설치할 필요 없이 자동으로 EC2 인스턴스를 모니터링합니다.

  • Amazon EC2 인스턴스에 대한 기본 모니터링: 사전 선택한 지표 7개를 5분 간격으로, 그리고 상태 확인 지표 3개를 1분 간격으로 모니터링합니다. 추가 비용은 없습니다.
  • Amazon EC2 인스턴스에 대한 세부 모니터링: 기본 모니터링에서 사용 가능한 모든 지표를 1분 간격으로 확인합니다. 추가 비용이 발생합니다. 인스턴스에 대한 세부 모니터링을 활성화하면 Amazon EC2 AMI ID 및 인스턴스 유형별로 데이터를 집계할 수 있습니다.
Auto Scaling 또는 Elastic Load Balancing을 사용할 경우 기본 모니터링을 선택하든, 세부 모니터링을 선택하든 관계없이 Amazon CloudWatch에서는 Auto Scaling 그룹 및 Elastic Load Balancer에서 집계한 Amazon EC2 인스턴스 지표도 제공합니다. 모니터링 데이터는 AWS 리소스가 종료된 경우에도 2주 동안 보관됩니다. 따라서 관심 있는 이전 이벤트의 지표를 빠르게 다시 살펴볼 수 있습니다. 기본 모니터링은 모든 Amazon EC2 인스턴스에 대해 자동으로 활성화되어 있으므로 AWS Management Console의 Amazon EC2 탭 또는 Amazon CloudWatch 탭을 통하거나 Amazon CloudWatch API를 사용하여 이러한 지표에 액세스할 수 있습니다.

프로 파일링 도구



테스트 단계

load-test-image001

aws에서는 위와 같은 그림의 부하 테스트 과정을 선호 합니다. 과정은 다음과 같습니다.

  1. 최초 ‘WEB’ 을 출력하는 웹 페이지를 대상으로 동시 연결성에 대한 테스트 수행 → 결과 평가→최적화 진행 (Client →Web Server)
  2. 웹 서버를 통해 애플리케이션 서버에서 넘겨 받은 ‘APPLICATION’ 을 출력하는 웹 페이지를 대상으로 동시 연결성에 대한 테스트 수행→ 결과 평가 → 최적화 진행 (Client →Web Server → App Server – w/o Logic)
  3. 데이터베이스에서 최소한의 쿼리 결과를 전달 받아 출력하는 웹 페이지를 대상으로 동시 연결성에 대한 테스트 수행 →결과 평가 → 최적화 진행
    (Client →Web Server → App Server – w/o Logic → Database)
  4. 3-tier 스택 전체를 대상으로 애플리케이션 로직이 적용된 페이지에 동시 연결성에 대한 테스트 수행 → 결과 평가 → 최적화 진행
    (Client → Web Server → App Server – with Logic →Database)
  5. 4번을 기반으로 다양한 시나리오를 지정하여 테스트 수행 → (얻고자 하는 지표 기준에 대해서) 결과 평과 → 최적화 진행


위의 단계에 기반하여 테스트를 진행해보도록 하겠습니다

테스트

환경

ec2 t2.micro 환경에서 테스트 하였습니다.


Family
Type
vCPUs 
Memory (GiB)
Instance Storage (GB) 
EBS-Optimized Available 
Network Performance 
IPv6 Support 
       


General purpose
t2.micro
Free tier eligible
1
1
EBS only
-
Low to Moderate
Yes



<참고 사이트>

http://bcho.tistory.com/787

https://aws.amazon.com/ko/blogs/korea/how-to-loading-test-based-on-aws/



# Change the MySQL database collation to UTF-8
ALTER DATABASE my_database DEFAULT COLLATE utf8_unicode_ci;

# Change the MySQL database character set to UTF-8
ALTER DATABASE my_database DEFAULT CHARACTER SET utf8;


1. 디버깅

로그메시지 출력

로그외 다른 디버깅 방법

: 코드 단계 별 동작 확인

: 실행 멈충 - 브레이크 포인트

: 특정 시점에서의 스택 상황

: 스코프 내 변수의 값 확인

디버깅 모드로 동작시키기

> node --debug

> node --debug-brk

디버깅 모드로 동작 중

> node --debug app.js

Node-Inspector

: Webkit 기반으로 Node.JS APP 동작 디버깅

: 디버깅 시작하기

: 디버깅 모드로 시작

: Node-inspector 실행하면 url이 나타남

: 이를 웹브러우저에 넣으면 확인가능

개발툴의 디버그 모드

2. 테스트

테스트 코드 작성

: 코드로 테스트 하기

: 테스팅 자동화

테스트 모듈

: assert, should, mocha

Assert 모듈 : assert

: 기본 모듈, 별도 설치 불필요

: var assert = require('assert');

: 테스트 하기

: 참 테스트

: assert.ok(value[, message])        //    value가 false면 메세지출력

: 동등테스트

: asser.equal(actual, expected[, message])

: 같은 객체비교, 내용비교, ===비교 세가지 종류가 있음

: 에러 발생

: assert.throws(block[,error][,message])

Assert 모듈 : should

: BDD 방식의 assert 작성

: behavior

: should

> var intVal = 5;

> intVal.should.ASSERT

: assert 함수

: .eql(otherValue)    //    ==

: .equal(otherValue)    //    ===

테스팅용 프레임 워크 : mocha

: npm install -g mocha

: 테스트 자동화와 리포팅

: TDD, BDD

: 다른 Assert 라이브러리와 결합 사용

3. 프로세스 관리

콘솔로 서비스 실행

: 콘솔 종료하면 애플리케이션 종료

: forever

: 콘솔 종료와 관계없이 애플리케이션 계속 실행

: 크래쉬 -> 자동 재실행

: forever 설치 (-g)

: 명령

: forever start server.js

: forever stop [UID]

: forever stopall

: forever list






'프로그래밍 > Nodejs' 카테고리의 다른 글

보안  (0) 2017.04.28
passport를 통한 인증  (0) 2017.04.28
인증  (0) 2017.04.27
socket.io 를 이용한 실시간 웹서비스  (0) 2017.04.27
소켓을 이용한 실시간 서비스  (0) 2017.04.27

1. 보안

사용자 가입과 로그인

: 가입 : 사용자 정보를 저장

: 로그인 : 사용자 정보를 전송

비밀번호 저장

: 비밀번호 암호화 저장

: 복호화 필요하지 않다

네트워크로 데이터 전송

: 데이터 암호화 - 전달

: 전달받은 암호화된 데이터 복호화

: 암호화 종류

: 복호화가 불가능한 암호화

: 복호화가 가능한 암호화

: 암/복호화

: 암호화

: 원본데이터를 변조해서 알수 없도록 변환

: 복호화

: 원본데이터로 변환

: 사용자 비밀번호 암호화 저장

: 복호화 불필요 

: 해쉬

: 사용자 개인정보 전송

: 복호화 필요

: 대칭/비대칭 키 암호화

: HTTPS

2. 해시

: 해시란?

: 단반향으로 생성하는 값, 함수

: 해시 특징

: 고정 크기의 해쉬값

: 입력값이 같으면 해시값도 같다

: 해시값이 같아도 입력값이 같다는 보장은 없다

: 단점, 한계임

: 해시 알고리즘

: MD5, SHA

3. 사용자 인증 정보 암호화

: 사용자 입력 해쉬 = DB 저장된 해쉬

: 사용자 암호에 소금 치기

: hash(charlie + !) // !가 솔트임.

: 솔트는 길게!

: 암호화 모듈

: crypto : 기본 모듈

: bcrypt : 확장 모듈

4. 암호화

 암호화 종류

: 대칭암호

: 같은 키로 암호화/복호화

: 키를 분배해야 한다

: 알고리즘

: DES, AES(레인달 알고리즘)

: 비대칭 암호

: 서로 다른 키(개인키, 공개키)로 암호화/복호화

: 개인키 : 공개안함

: 개인키로 암호화 - 공개키로 복호화

: 공개키로 암호화 - 개인키로 복호화

: 대칭 암호에 비해서 느리다

보안서버 만들기

: HTTPS(HTTP over SSL)

: 데이터 암호화 통신

: SSL

: 넷스케이프 SSL -> IETF의 TLS

: 대칭키 방식

: SSL 인증서

: 서비스를 제공하는 서버의 정보

: 신뢰성있는 인증기관 (CA)의 서버 인증

: 서버 공개키 : 비대칭 암호화 용

인증서 발급

: 공인된 인증 기관에서 인증서 발급

: 유료

: 인증기관, Verisign, Comodo

: 사설 인증서 발급    

: 키와 인증서 생성 프로그램 : openssl

: 경고발생

사설 인증서로 보안서버 만들기

: 보안 서버를 만들기 위해 필요한 것

: 키

: 인증서

: 인증서 발급 단계

: 키 생성

: 키에서 인증서 발급 요청(csr) 생성

: 인증서 발급 요청에서 인증서 발급

사설 인증서로 보안 서버 만들기

: https 모듈 사용

: 보안서버 생성

: https.createServer(option, [])

: option 에 key, cert, passphase가 있어야함.

: express를 사용해서도 가능

: 영리 목적으로하는 개인 정보 수집 서비스는 사용해야함.

: 보안 서버 의무화

: 무료

: www.startssl.com

: letsencrypt.org










'프로그래밍 > Nodejs' 카테고리의 다른 글

디버깅과 테스트와 프로세스 관리  (0) 2017.04.28
passport를 통한 인증  (0) 2017.04.28
인증  (0) 2017.04.27
socket.io 를 이용한 실시간 웹서비스  (0) 2017.04.27
소켓을 이용한 실시간 서비스  (0) 2017.04.27

1. 인증

인증 작성하기

: 서비스내 직접 인증 기능 작성(Local Auth)

: 3자 인증 기능 사용(OAuth)

: OpenID - 인증만 제공해주는 서비스

로컬 인증

: 서비스 자체에서 사용자 가입

: 사용자 로그인 기능

: 사용자 정보 관리

: 필요한 점

: ID/PW가 서버와 클라이언트 메시지에 담겨서 이동

: 서버에 ID/PW 저장

: 사용자 정보 암호화

: 보안 통신 필요 : HTTPS

3자 인증

: 다른 서비스에 등록된 사용자의 인증 정보 사용

: 직접 가입/로그인 절차 없음

: ID/PW 노출 위험 적다

: 다른 서비스에서 토큰 발급

: 새로운 서비스

: 새로운 사용자라면, 인증하라고 요청

: 서비스키 제공- client_id, secret

: 가입된 서비스에 3자 인증 요청

: 가입된 서비스에 인증

: 인증 정보를 새로운 서비스에 전달

: 가입된 서비스에 인증 상황 문의

: 인증된 사용자 인지 문의

: 서비스 사용 가능

2. Passport

인증 모듈

: passport, everyauth

Passport 다루기 절차

1 : 모듈 로딩과 초기화

> var passport = require('passport');

> app.use(passport.initialize());

2 : Strategy 설정

> var Strategy = require('passport-strategy').Strategy;

> passport.use(new Strategy(function username, password, done){})

: 다양한 Strategy 제공

: Local Auth

: facebook, wirtter, google, kakao talk

3 : 인증

> app.port('login',passport,authenticate('local'))

: 인증 성공시

: 성공 메세지와 코드

: 성공 페이지 이동(웹)

: 인증 실패시

: 실패 메시지와 코드, 로그인페이지(웹)

4 : 세션 기록과 읽기

> passport.serializeUser(function(user, done){})

> passport.deserializeUser(function(id,done))

: 요청마다 세션 기록과 읽기

: passport.authenticate 이후 세션기록(serializeUser)

: 일반 요청마다 세션에서 읽기 (deserializeUser)

: 세션에서 읽어온 데이터

> req.user

5 : 사용자 정보

> req.user

3. LocalAuth

로컬 인증용 Strategy

설치

: npm install passport-strategy







'프로그래밍 > Nodejs' 카테고리의 다른 글

디버깅과 테스트와 프로세스 관리  (0) 2017.04.28
보안  (0) 2017.04.28
인증  (0) 2017.04.27
socket.io 를 이용한 실시간 웹서비스  (0) 2017.04.27
소켓을 이용한 실시간 서비스  (0) 2017.04.27

1. 보안과 인증 

인증

: 등록된 사용자 식별

: 사용자 별 권한

보안

: 정보 노출 방지 : 암호화 통신 방법

: 정보 해독 방지 : 데이터 암호화 저장

2. 쿠키

클라이언트의 활동 추적하기

: 로그인 하지 않은 사용자가 쇼핑몰을 사용한다

: 쇼핑몰에서 상품을 장바구니에 넣으면

: 다음 쇼핑몰에 방문했을 때 장바구니는?

: 장바구니 내용을 브라우저에 기록

서버가 웹브라우저에 기록

: 상품을 장바구니에 담기

: 쿠키에 장바구니 내용 저장

웹브라우저는 쿠키 내용 전송

: 서버는 요청에서 쿠키 읽기

: 기존에 기록한 내용 확인

HTTP 메시지와 쿠키

: 서버 -> 클라이언트

: 응답 메세지에 쿠키 기록을 위한 메세지 작성

: 메시지 헤더 : Set-Cookie 필드

: 클라이언트 -> 서버

: 클라이언트의 쿠키를 서버로 전송

: 요청 메시지 헤더의 cookie

HTTP 모듈로 쿠키 다루기

: 쿠키 쓰기

: res.setHeader('Set-Cookie','name=value');

: 쿠키 읽기

: 쿠키 값 파싱 코드 필요

: req.headers.cookie    //    'name = value'

Express 에서 쿠키 다루기

: 쿠키 쓰기 - Express 기본

: res.cookie(이름, 값)

: res.clearCookie(이름)

: 옵션을 통해 시간, 등등을 정함.

: 쿠키 읽기 : 쿠키 파서 모듈

: npm install cookie-parser

: 미들웨어에 쿠키파서를 넣으면됨.

: req.cookies.이름

서명 쿠키

: 쿠키 서명하기

: 쿠키 변조 방지

: 서명된 쿠키 사용하기

: 쿠키파서 설정

: 쿠키쓰기

: 쿠키 읽기

쿠키의 문제

: 메시지 크기가 커진다. 느려진다

: 다른 웹브라우저, 보안에 취약

3. 세션

: 서버에 정보 저장

: 클라이언트에는 세션 식별 정보(세션 ID)

: 세션 ID는 쿠키 사용

: 세션 모듈    :    express-session

: 미들웨어에 넣는다.

: 읽고 쓰기가 간단하게 처리된다.

세션 저장

: 세션 - 서버에 기록    

     : 서버 재시작 -> 세션 기록 삭제

: 서버 메모리

: 서버 클러스터링

: 세션을 데이터 베이스에 저장

: Session Store 모듈

: 어디에 저장하는냐를 결정

: connect-mongo

: connect-redis





'프로그래밍 > Nodejs' 카테고리의 다른 글

보안  (0) 2017.04.28
passport를 통한 인증  (0) 2017.04.28
socket.io 를 이용한 실시간 웹서비스  (0) 2017.04.27
소켓을 이용한 실시간 서비스  (0) 2017.04.27
Nodejs와 MongoDB  (0) 2017.04.27

1. 실시간 웹서비스와 socket.io

실시간 서비스 작성하기

: HTTP의 한계

: socket

: 데스크탑 애플리케이션 - 가능

: 모바일 애플리케이션 - 가능

: 웹 브라우저 - 불가능

웹브라우저에서 실시간 웹 서비스 사용하기

: ajax, polling, long poling, 웹 소켓...

: 다양한 시도가 있었지만, 다양한 웹 브라우저 때문에 한계가 존재.

: 여러 기술을 한번에 사용해야 된다는 어려움

실시간 서비스 작성하기

: socket.io : 호환되는 기술을 자동 선택

: npm install socket.io

socket.io 서버와 클라이언트

: 서버

: HTTP 서버

: socket.io 서버

: 클라이언트 

: HTTP 클라이언트, 모바일...

: socket.io 클라이언트

: 서비스 시작

: HTTP 서버 준비

: socket.io 서버 준비

: socket.io 클라이언트 요청 - HTML로 응답

: socket.io 초기화 및 서버 접속

: 연결이 끊어 졌을 경우 자동 재접속 시도

2. 데이터 교환

데이터 교환

: TCP 방법과의 차이이다. 스트림이 아니라, 이벤트를 이용하여 처리한다!

: 메시지 주고받기 - 이벤트 기반

: 메시지 이벤트 정의

: 메시지 전송

: socket.emit('EVENT', data)

: 이벤트 수신

: socket.on('EVENT',function(data){});

이벤트로 메시지 주고 받기

: 서버에 이벤트 등록

: 클라이언트 이벤트 등록

: 서버에서 이벤트 발생

: 소켓 하나에 이벤트 발생

: 연결된 모든 소켓에 이벤트 발생

3. 네임스페이스와 룸

: socket.io 기본연결

: 소켓과 1:1 연결

: 모든 소켓과 통신

: 1:N 통신

: 개별 소켓과 1:1통신 N번 반복

: 네임스페이스

: 룸

: 네임스페이스로 socket.io 연결 구분

: 같은 네임 스페이스에서만 메시지 주고 받음

: 기본 네임 스페이스 : /

: 커스텀 네임 스페이스 : /NAME-SPACE

: var system = require('socket.io')(server).of('/system')

: 네임스페이스 내 채널

: 같은 룸에서만 데이터 교환

: 룸에 입장, 여러 룸에 입장 가능

: 룸에서 떠나기

: 서버쪽에서 클라이언트를 룸에 입장 시키고 퇴장시킬 수 있음.


'프로그래밍 > Nodejs' 카테고리의 다른 글

passport를 통한 인증  (0) 2017.04.28
인증  (0) 2017.04.27
소켓을 이용한 실시간 서비스  (0) 2017.04.27
Nodejs와 MongoDB  (0) 2017.04.27
Node.js와 MySQL  (0) 2017.04.27

1. 실시간 서비스

: HTTP를 이용해서 구현하면 요청-응답이라는 한계때문에 실시간으로 반영하지 못함.

실시간 서비스 구현하기

HTTP 통신

: 요청과 응답 기반

: 다시 요청할 때 까지 변경사항 반영 안됨

: HTTP가 아는 다른 프로토콜을 사용해야 한다 -> TCP

TCP 통신

: 네트워크 레이어 : Tranport Layer

: 스트림을 이용한 실시간 통신

: 소켓을 이용한 네트워크 프로그래밍

소켓

통신 접점

소켓 프로그래밍

: 데이터 그램 소켓 : UDP

: 스트림 소켓 : TCP

TCP 

: 연결필요

: 신뢰성, 손실데이터 재전송

: 혼잡도 제어

: UDP에 비해 느림

: 신뢰성 있는 실시간 통신

: FTP, HTTP, SMTP

: UDP

: 연결 불필요

: 신뢰성 없음

: 데이터 흐름 없음

: 빠름

: 속도 중시형 실시간 통신, 스트리밍 비디오/오디오

: DNS, DHCP, SNMP

TCP

: 연결 지향이므로 연결 과정 필요

: 연결과정

1 : 서버 소켓 생성, 준비, 대기

2 : 클라이언트 소켓 연결, 소켓간 연결

3 : 데이터 교환

4 : 접속 끊기

TCP데이터 주고 받기

: 스트림 기반

: 보내기 : 스트림에 write

: 받기 : 스트림에서 read

UDP(User Datagram Protocol)

2. TCP 실시간 통신 서비스

net 모듈

: 소켓 통신을 위한 기본 모듈 : net

> var net = require('net')

: 클래스

: net.Server, net.Socket

TCP 서버

: 서버 생성

> net.createServer(옵션, 리스너)

: 서버 함수

: listen(port, [호스트],콜백...) : 클라이언트 접속 대기

: close(콜백) : 추가 접속을 받기 않는다.

: getConnections(콜백) : 연결 갯수

: address() : 서버 주소

: 서버 이벤트

: listening : 포트 바인딩, 접속 가능한 상태 이벤트

: connection : 클라이언트 접속 이벤트

: close : 서버 닫기(연결된 소켓이 없을때만 발생)

: error : 에러

3.UDP 실시간 서비스

: TCP와 비슷한 방법이지만, 커넥트 부분이 빠져있다.

: 스트링 방식이 아니라, 패킷 방식이다.

: 서버, 클라이언트 소켓 구분이 없다.




'프로그래밍 > Nodejs' 카테고리의 다른 글

인증  (0) 2017.04.27
socket.io 를 이용한 실시간 웹서비스  (0) 2017.04.27
Nodejs와 MongoDB  (0) 2017.04.27
Node.js와 MySQL  (0) 2017.04.27
Express  (0) 2017.04.24

1. MongoDB 

모듈 설치

: mongoDB용 모듈

: mongodb : MongoDB Nodejs Driver

: Mongoose : ODM

2. MongoDB Driver

MongoDB js

: 드라이버

: mongo 콘솔 클라이언트 명령과 동일하게 조작

: 설치

: npm install mongodb

: 콜랙션 얻기, 따로 변수로 저장해두면 편함


'프로그래밍 > Nodejs' 카테고리의 다른 글

socket.io 를 이용한 실시간 웹서비스  (0) 2017.04.27
소켓을 이용한 실시간 서비스  (0) 2017.04.27
Node.js와 MySQL  (0) 2017.04.27
Express  (0) 2017.04.24
RESTful  (0) 2017.04.24

+ Recent posts