설정 템플릿

{
  "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"
  ]
}

Note

HTTPS 연결

  • 서비스 적용단계 의 롤백상황에 항시 대비해야 한다.

  • 로드밸런서나 방화벽이 SSL Offloading으로 HTTP를 보장하는 환경이 아니라면 https 인증서과 원본 HTTPS 통신은 필수이다.

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
        }
      }
    }
  }
}
  • 최적화할 리소스 도메인을 각각 optimg , optvideo 에 명시한다.

  • 대상 도메인이 자신(이 경우에는 www.example.com )일 수 있기 때문에 hyperdims , transcoder 모두 활성화할 것을 권장한다.

  • 구성 도메인이 많다면 basehost 로 구성하여 공유하는 방식을 권장한다.

Warning

hdims , xcdr , proxy 등의 함수명이 변경되는 경우라면 관련설정을 추가해 준다.

3. PageSpeed 적용

서비스 URL을 변경이 없다. urlRewritespagespeed 를 적용한다.

"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

pagespeedbypass 에 기반하여 동작하기 때문에 해당되지 않는다.

5. CPU 쓰로틀링 (옵션)

pagespeed 노드 단독구성을 권장하지만, 이미지/비디오 서비스와 같이 구성되는 경우 throttling 을 상향할 것을 권장한다.

"functions": {
  "contents": {
    "pagespeed": {
       "meta" : {
         "enable" : true,
         "throttling": {
          "enable": true,
          "cpu": {
            "deactive": 80,
            "reactive": 60
          }
        }
      }
    }
  }
}
  • 평균 CPU 사용량이 80%이상이라면 pagespeed 를 비활성화한다.

  • 평균 CPU 사용량이 60%미만으로 낮아지면 pagespeed 를 다시 활성화한다.

Warning

비디오 트랜스코딩이 발생하면 순간적으로 CPU가 최대치까지 상승될 수 있다.

환경 구성

서비스 환경에 맞추어 전역구성이 변경될 수 있다.

1. env 전역설정

git 형상관리 관리를 위해 가급적 순차증가하는 meta.version 정책을 권장한다.

{
  "env": {
    ...
  }
}

1.1 HTTP 수신버퍼

32KB이상을 권장하며, 원본서버의 최대 수신버퍼 크기를 확인하여 설정한다.

"network": {
  "http" : {
    "recvBufferSize": 32768
  }
}

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"
      }
    }
  }
}
  • 솔루션이 시스템 가용메모리의 절반만 사용하도록 totalUsableRatio50(%) 으로 설정한다.

  • 나머지 절반에 해당하는 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
    },
  }
}