설정 템플릿¶
{
"meta": {
"version": "1",
"comment": "pagespeed setting.json example"
},
"env": {
"network": {
"http" : {
"recvBufferSize": 32768
}
}
},
"functions": {
"network": {
"http": {
"frontEnd": {
"session": {
"keepAliveSec": 62
},
"bypass": {
"extraMethods": [
"PUT",
"DELETE",
"PATCH",
"TRACE",
"OPTIONS"
]
}
},
"backEnd": {
"session":{
"reuseTimeout": 5
},
"health": {
"exclusion": {
"count": 0
}
},
"headers": {
"originalEtag": {
"enable": true
},
"userAgent": {
"enable": true,
"value": "*"
},
"host": {
"enable": true,
"value": "*"
}
}
}
}
}
},
"hosting": [
{
"name": "www.example.com",
"origin": {
"protocol": "https",
"address": [
"org.example.com"
]
},
"functions": {
"contents": {
"pagespeed": {
"meta" : {
"enable" : true
},
"optimg": {
"matchingList": [
{
"src": "img.example.com",
"dest": "img.example.com"
}
]
},
"optvideo": {
"matchingList": [
{
"src": "img.example.com",
"dest": "img.example.com"
}
]
}
},
"hyperdims": {
"meta": {
"enable": true
}
},
"transcoder": {
"meta": {
"enable": true
}
}
}
},
"urlRewrites": [
{
"pattern": "!FUNCTION[*] & $METHOD[GET;POST;HEAD] & $URL[^www.example.com\/(.*)]",
"replace": "www.example.com/#1/pagespeed/optimg/default/optvideo/default"
}
]
}
]
}
가상호스트 구성¶
hosting 설정으로 서비스할 가상호스트를 구성한다.
{
"hosting": [
...
]
}
1. 호스팅과 라우팅 구성¶
서비스 도메인 www.example.com 로 호스팅하며, https://org.example.com 를 원본서버로 통신한다.
"name": "www.example.com",
"origin": {
"protocol": "https",
"address": [
"org.example.com"
]
}
2. PageSpeed 활성화¶
pagespeed 를 활성화한다.
"functions": {
"contents": {
"pagespeed": {
"meta" : {
"enable" : true
},
"optimg": {
"matchingList": [
{
"src": "img.example.com",
"dest": "img.example.com"
}
]
},
"optvideo": {
"matchingList": [
{
"src": "img.example.com",
"dest": "img.example.com"
}
]
}
},
"hyperdims": {
"meta": {
"enable": true
}
},
"transcoder": {
"meta": {
"enable": true
}
}
}
}
}
대상 도메인이 자신(이 경우에는
www.example.com)일 수 있기 때문에 hyperdims , transcoder 모두 활성화할 것을 권장한다.구성 도메인이 많다면 basehost 로 구성하여 공유하는 방식을 권장한다.
Warning
hdims , xcdr , proxy 등의 함수명이 변경되는 경우라면 관련설정을 추가해 준다.
3. PageSpeed 적용¶
서비스 URL을 변경이 없다. urlRewrites 로 pagespeed 를 적용한다.
"urlRewrites": [
{
"pattern": "!FUNCTION[*] & $METHOD[GET;POST;HEAD] & $URL[^www.example.com\/(.*)]",
"replace": "www.example.com/#1/pagespeed/optimg/default/optvideo/default"
}
]
전체 일괄적용 패턴인 $URL[^www.example.com\/(.*)] 과 결합되는 조건은 다음과 같다.
!FUNCTION[*]다른 함수를 명시적으로 직접 호출하는 경우와 충돌을 방지한다.https://www.example.com/logo.jpg/hdims/format/avif/optimize
$METHOD[GET;POST;HEAD]처리가능한 메소드만 명기한다.
4. 이미지/비디오 캐싱정책 검토¶
기본은 캐시모드지만 CDN이 적용된 서비스라면 이중캐싱으로 콘텐츠 갱신에 문제가 발생할 수 있다.
이런 경우 이중캐싱 상황을 방지하려면 instnat bypass 가 적용되도록 구성한다.
"frontEnd": {
"bypass": {
"matchingList": [
{
"pattern": "$METHOD[GET;HEAD] & $URL[*]",
"action": "instant"
}
]
}
}
instant 모드로 바이패스 효과내기 를 참고한다.
Note
pagespeed 는 bypass 에 기반하여 동작하기 때문에 해당되지 않는다.
5. CPU 쓰로틀링 (옵션)¶
pagespeed 노드 단독구성을 권장하지만, 이미지/비디오 서비스와 같이 구성되는 경우 throttling 을 상향할 것을 권장한다.
"functions": {
"contents": {
"pagespeed": {
"meta" : {
"enable" : true,
"throttling": {
"enable": true,
"cpu": {
"deactive": 80,
"reactive": 60
}
}
}
}
}
}
Warning
비디오 트랜스코딩이 발생하면 순간적으로 CPU가 최대치까지 상승될 수 있다.
환경 구성¶
서비스 환경에 맞추어 전역구성이 변경될 수 있다.
1. env 전역설정¶
git 형상관리 관리를 위해 가급적 순차증가하는 meta.version 정책을 권장한다.
{
"env": {
...
}
}
1.1 HTTP 수신버퍼¶
32KB이상을 권장하며, 원본서버의 최대 수신버퍼 크기를 확인하여 설정한다.
"network": {
"http" : {
"recvBufferSize": 32768
}
}
HTTP 수신버퍼 변경설정 를 설정한다.
64KB를 초과하는 상황이라면 메모리 사용량을 재검토한다.
1.2 고용량 비디오 서비스¶
고용량 비디오를 가공하는 경우라면 고사양 서버(32코어 이상)가 필요하다. 다음은 32코어, 64GB 메모리 환경에서의 비디오 특화 구성이다.
"properties": {
"memoryUsage": {
"totalUsableRatio": 50
},
"process": {
"transcoder": {
"memory": "32768m",
"concurrent": 2,
"waitQueue": 4,
"respawnable": 1,
"domainQueue": 0,
"priorityCommand": ["capture", "trim"],
"keepalive": {
"maxage": "0s",
"timewait": "1m"
}
}
}
}
솔루션이 시스템 가용메모리의 절반만 사용하도록 totalUsableRatio 를
50(%)으로 설정한다.나머지 절반에 해당하는 32GB를 transcoder 에게 전용으로 할당한다.
2. functions 전역설정¶
http 함수의 정책만 전역으로 설정한다.
{
"functions": {
"network": {
"http": {
...
}
}
}
2.1 클라이언트 통신¶
클라이언트와 솔루션 사이의 구간이다.
"frontEnd": {
"session": {
"keepAliveSec": 62
},
"bypass": {
"extraMethods": [
"PUT",
"DELETE",
"PATCH",
"TRACE",
"OPTIONS"
]
}
}
keepAliveSec 는 앞단의 LB의 세션 유지시간에 2초를 더 한 것이다.
Note
AWS ALB의 기본 유지시간이 60초이다.
GET, POST, HEAD메소드가 아닌 extraMethods 는 모두 원본으로 바이패스 한다.
2.2 원본 통신¶
솔루션과 원본 사이의 구간이다.
"backEnd": {
"session":{
"reuseTimeout": 5
},
"health": {
"exclusion": {
"count": 0
}
},
"headers": {
"originalEtag": {
"enable": true
},
"userAgent": {
"enable": true,
"value": "*"
},
"host": {
"enable": true,
"value": "*"
}
}
}
원본서버의 세션 재사용 정책을 완전히 신뢰할 수 없기 때문에 reuseTimeout 은 5초로 짧게 구성한다. 신뢰구간이기 때문에 연결비용이 낮다.
원본서버를 배제하지 않도록 배제 카운트 를 0으로 설정한다.
원본서버의 갱신 메커니즘이
ETag헤더에 기반할 수도 있기 때문에 originalEtag 설정을 활성화한다.클라이언트 요청의
Host,User-Agent가 온전하게 원본서버로 전송되도록 host , userAgent 설정을 활성화한다.
Warning
만약 원본서버의 동작방식이 Cookie 헤더 또는 비표준 헤더에 기반하고 있다면 모든 헤더를 포워딩해주어야 한다.
이런 경우 wholeClientRequest 설정도 활성화한다.
"backEnd": {
"headers": {
"wholeClientRequest": {
"enable": true
},
}
}