network

소켓, HTTP 프로토콜 등 전역 네트워크에 대해 설정한다. /usr/local/m2/setting.json 다음 영역에 대해 기술한다.

{
  "env": {
    "network": {
      ...
    }
  }
}

passiveSockets

제한없이 클라이언트 요청을 모두 허용하면 시스템에 지나친 부하가 발생할 수 있다. 시스템 과부하는 사실상 장애이다. 적절한 수치에서 클라이언트 요청을 거부하여 시스템을 보호한다.

"passiveSockets": {
  "listenIps": [
    "10.10.10.10",
    "10.10.10.11",
    "127.0.0.2"
  ],
  "maxCount": 80000,
  "reopenRatio": 75
}
listenIps (기본: 0.0.0.0)

모든 가상호스트가 Listen할 IP목록을 지정한다.

maxCount (기본: 80,000, 최대: 100,000)

연결을 허용할 최대 클라이언트 소켓 수. 이 수치를 넘으면 신규 클라이언트 접속을 즉시 닫는다. maxCountreopenRatio (기본: 75%) 비율만큼 소켓 수가 감소하면 다시 접속을 허용한다.

reopenRatio (기본: 75%)

(최대 패시브 소켓접속 도달 시) 접속차단 후 이 비율만큼 소켓 수가 감소하면 다시 접속을 허가한다.

../../../_images/maxsockets.png

(기본 설정에서) 전체 클라이언트 소켓 수가 8만을 넘으면 신규 클라이언트 접속은 즉시 종료된다. 전체 클라이언트 소켓 수가 6만(8만의 75%)이 되면 다시 접근을 허용한다.

예를 들어 3만개의 클라이언트 세션을 처리할 때 원본 서버들이 모두 한계에 도달하면 이 수치를 3~4만 정도로 설정하는 것이 좋다. 이로 인해 얻을 수 있는 효과는 다음과 같다.

  • 별다른 Network 구성(e.g. L4 세션조절 등)이 필요 없다.

  • 불필요한(원본 부하로 처리될 수 없는) 클라이언트 요청을 방지한다.

  • 서비스의 신뢰성을 높인다. 서비스 Burst 이후 재시작 등 점검 작업이 필요 없다.

http

HTTP 요청을 처리하기 위한 초기/증설 세션 수를 설정한다.

"http" : {
  "recvBufferSize": 16384,
  "initCount": 10000,
  "increaseCount": 6000
}

별도 설정하지 않을 경우 물리 메모리 크기에 따라 자동으로 설정된다.

물리메모리

initCount, increaseCount

1GB

2.5천, 1천

2GB

5천, 2천

4GB

1만, 4천

8GB 이상

1만, 6천

recvBufferSize (기본: 16384bytes)

세션당 최대 수신버퍼 크기

initCount

최초 세션 수

increaseCount

증설 세션 수

제한적인 환경에서 적은 수의 소켓만으로도 서비스가 가능할 때 소켓 수를 줄이면 메모리를 절약할 수 있다.

https

HTTPS 요청을 처리하기 위한 초기/증설 세션 수를 설정한다.

"https" : {
  "enableSni": true,
  "initCount": 10000,
  "increaseCount": 6000
}

enableSni (기본: true)

  • true 같은 IP+Port 조합(생략할 경우 *:443 )으로 여러개의 인증서를 지원한다.

    아래의 경우처럼 443포트로 여러개의 인증서를 지원할 수 있다.

  • false (기본) Multi Port 또는 Multi NIC 방식으로 여러 인증서를 지원해야 한다.

initCount (기본: 10000)

최초 세션 수

increaseCount (기본: 6000)

증설 세션 수

http2

HTTP2를 활성화한다.

"http2": {
  "enable": false,
  "concurrentStreamMaxCount": 10,
  "keepAliveSec": 10,
  "maxRequestHeaderFields": 200,
  "maxResponseHeaderFields": 500
}
enable (기본: false)

http2를 활성화한다.

concurrentStreamMaxCount (기본: 10)

단일 HTTP2 세션으로 진행가능한 HTTP Stream의 최대 개수

keepAliveSec (기본: 10초)

세션 유지시간(초)

maxRequestHeaderFields (기본: 200개)

HTTP 요청헤더의 최대개수

maxResponseHeaderFields (기본: 500개)

HTTP 응답헤더의 최대개수

HTTP/2는 동적 리로딩이 지원되지 않는다. 설정 변경 후 반드시 재가동 해주어야 한다.

Note

HTTP/2가 활성화되면 통계 수집시점이 Payload가 송/수신 되는 어플리케이션으로 변경된다. 따라서 아래의 이유로 통계 집계 시 약간의 오차가 발생할 수 있다.

  • HTTP/2 HPACK과 멀티 Stream 처리 방식

  • TLS 에서의 멀티 프로토콜 HTTP/1.1, HTTP/2 수용

tls

tls 프로토콜 동작을 설정한다.

"tls": {
  "ciphers": "ALL:!DSS:!RC4:!IDEA:!CAMELLIA:!aNULL:!eNULL",
  "minVersion": "TLSv1.0",
  "maxVersion": "TLSv1.3"
}
ciphers (기본: ALL:!DSS:!RC4:!IDEA:!CAMELLIA:!aNULL:!eNULL)

TLS Cipher Suites

minVersion (기본: TLSv1.0)

최소 사용버전

minVersion (기본: TLSv1.3)

최대 사용버전

geoip

GeoIP를 사용하여 국가별로 접근을 차단할 수 있다. GeoIP Databases 중 Binary Databases를 GEOIP_MEMORY_CACHE and GEOIP_CHECK_CACHE 로 링크하여 실시간으로 변경내용을 반영한다.

"geoip": {
  "enable": false,
  "ver": "geoip",
  "path": "/var/m2/geoip/"
}
enable (기본: false)

GeoIP를 활성화한다.

ver (기본: geoip)

GeoIP 버전을 설정한다. geoip 또는 geoip2

path

GeoIP 경로 또는 URL

국가코드는 ISO 3166-1 alpha-2ISO 3166-1 alpha-3 를 지원한다.

Note

GeoIP는 파일명이 예약되어 있으므로 반드시 저장된 로컬경로를 입력하도록 설정한다. 또한 자동으로 변경이 반영되기 때문에 별도로 설정을 Reload하지 않아도 된다.

GeoIP가 설정되어 있다면 해당 디렉토리에 저장된 파일목록을 조회한다. 설정되어 있지 않다면 404 NOT FOUND로 응답한다.

http://127.0.0.1:10040/monitoring/geoiplist

결과는 JSON형식으로 제공된다.

{
    "version": "2.0.0",
    "method": "geoiplist",
    "status": "OK",
    "result":
    {
        "path" : "/usr/local/m2/geoip/",
        "files" :
        [
            {
                "file" : "GeoIP.dat",
                "size" : 766255
            },
            {
                "file" : "GeoLiteCity.dat",
                "size" : 12826936
            }
        ]
    }
}

pipelineSession

M2 서비스 파이프라인 구성 세션에 대해 설정한다.

"pipelineSession": {
  "internalTimeout": 300,
  "externalTimeout": 10,
  "listenTimeout": 10,
  "keepAlive": {
    "enable": true,
    "reuseTimeout": 10
  }
}
internalTimeout (기본: 300초)

Loopback 타임아웃

extenalTimeout (기본: 10초)

외부통신 타임아웃

listenTimeout (기본: 10초)

Listen 타임아웃

keepAlive

세션 Keep-Alive 설정

enable (기본: true)

세션 재사용

reuseTimeout (기본: 10초)

세션 재사용 시간(초)