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" : {
  "initCount": 10000,
  "increaseCount": 6000
  "recvBufferSize": 16384
}

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

물리메모리

initCount, increaseCount

1GB

2.5천, 1천

2GB

5천, 2천

4GB

1만, 4천

8GB 이상

1만, 6천

initCount

최초 세션 수

increaseCount

증설 세션 수

recvBufferSize (기본: 16KB)

세션당 기본 수신버퍼 크기

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

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,
  "enableHttp3": false,
  "concurrentStreamMaxCount": 10,
  "keepAliveSec": 10,
  "maxRequestHeaderFields": 200,
  "maxResponseHeaderFields": 500
}
enable (기본: false)

http2를 활성화한다.

enableHttp3 (기본: false)

http3를 활성화한다.

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.2",
  "maxVersion": "TLSv1.3"
}
ciphers (기본: ALL:!DSS:!RC4:!IDEA:!CAMELLIA:!aNULL:!eNULL)

TLS Cipher Suites

minVersion (기본: TLSv1.2)

최소 사용버전

minVersion (기본: TLSv1.3)

최대 사용버전

geoip

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

"geoip": {
  "enable": false,
  "ver": "geoip2",
  "path": null
}
enable (기본: false)

GeoIP를 활성화한다.

ver (기본: geoip2)

현재는 geoip2 단독버전만 지원한다.

path

GeoIP 경로를 설정하면 해당 경로의 파일을 로딩한다.

Note

국가코드는 ISO 3166-1 alpha-2 규격을 지원한다.

정상구성되어 있다면 로딩된 GeoIP 파일목록을 제공한다. (없을 경우 404 가 응답된다.)

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초)

세션 재사용 시간(초)