본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Fly Proxy와 콘텐츠 인코딩

원문 보기 위키 갱신

Fly.io 앱은 종종 HTML, CSS, JavaScript, JSON처럼 많은 텍스트를 제공해요. 응답을 압축하면 대역폭이 줄고 전달 속도가 빨라지며, 저희 에지 프록시가 이를 자동으로 처리합니다. 앱이 명시적으로 Content-Encoding 헤더를 설정하지 않으면, 클라이언트의 Accept-Encoding 헤더에 기반해 사용자를 대신해 압축을 협상합니다.

출처: 문서

본문

이 페이지는 저희 프록시가 HTTP 응답 압축을 어떻게 처리하는지 설명해서, 기본적으로 더 나은 성능을 얻을 수 있도록 해 줍니다.

Fly.io 앱은 종종 많은 텍스트를 제공합니다: HTML, CSS, JavaScript, JSON. 이러한 응답을 압축하면 대역폭을 줄이고 전달 속도를 높여줘요. 저희 에지 프록시가 이를 자동으로 처리합니다. 앱이 명시적으로 Content-Encoding 헤더를 설정하지 않는 한, 클라이언트의 Accept-Encoding 헤더를 기반으로 사용자를 대신해 압축을 협상합니다.

이 동작은 보통 그냥 잘 동작합니다(Just Works). 하지만 신경 쓸 만한 엣지 케이스들이 있어요. 어떻게 동작하는지, 무엇을 지원하는지, 필요할 때 어떻게 재정의하는지 살펴볼게요.

콘텐츠 인코딩이란?

콘텐츠 인코딩은 HTTP 응답 본문(서버가 클라이언트로 보내는 데이터 또는 콘텐츠)을 압축합니다. 클라이언트는 지원하는 알고리즘을 나열하는 Accept-Encoding 헤더를 포함합니다. 서버가 그중 하나라도 지원하면 응답을 압축하고 사용된 알고리즘을 나타내는 Content-Encoding 헤더를 설정해요. 그러면 클라이언트는 렌더링하기 전에 본문을 압축 해제합니다.

일반적인 인코딩:

  • br (Brotli)
  • gzip
  • zstd (Zstandard)
  • deflate

이 모두는 무손실입니다. 이것들은 암호화가 아니며, 청크 전송 인코딩과도 다릅니다. 단지 페이로드를 더 작게 만들 뿐이에요.

Fly.io 프록시가 지원하는 것

Fly.io 프록시는 에지에서 압축을 처리하며, 클라이언트와 프록시가 모두 지원하는 가장 효율적인 알고리즘을 자동으로 선택합니다. 우선순위는:

  1. Zstandard (zstd) — 성능과 크기 면에서 전반적으로 최고. Chrome과 Firefox에서 지원.
  2. Brotli — 여전히 훌륭하며 특히 텍스트에 좋음. 많은 경우 gzip보다 파일이 작아요.
  3. gzip — 폴백. 널리 지원됨.
  4. deflate — 거의 사용되지 않지만 여전히 지원됨.

프록시는 이미 Content-Encoding 헤더가 포함되지 않은 응답만 압축합니다. 앱이 설정하면 프록시는 응답을 수정하지 않고 통과시켜요. Content-Encoding: none을 설정해 압축을 명시적으로 비활성화할 수도 있습니다.

구성 (Configuration)

프록시 수준 압축을 활성화하려면 HTTP 핸들러를 구성하세요:

서비스의 fly.toml 파일에서 http 핸들러를 사용해야 합니다. 이를 수행하는 방법은 두 가지가 있어요(하나만 선택하세요!):

  • http_service는 HTTP를 말하는 서비스를 위해 가장 일반적인 옵션을 미리 구성합니다. 포트 80과 443 모두에서 http 핸들러를 암시적으로 사용합니다(그리고 당연히 포트 443에서는 tls 핸들러도 추가로 사용).
[http_service]
  internal_port = 8080
  force_https = true
  auto_stop_machines = "stop"
  auto_start_machines = true
  min_machines_running = 0
  [http_service.concurrency]
    type = "requests"
    soft_limit = 200
    hard_limit = 250
  • http 핸들러를 명시적으로 사용하는 service 블록. 이 예시는 외부 포트 80에서 http만 제공합니다(https 아님):
[[services]]
  internal_port = 8080
  protocol = "tcp"
  auto_stop_machines = "stop"
  auto_start_machines = true
  min_machines_running = 0
[[services.ports]]
    handlers = ["http"]  # This is the important part
    port = 80

외부 포트 443도 https로 제공하려면 위에 다음을 추가하세요:

[[services.ports]]
    handlers = ["tls", "http"]
    port = 443

동작을 사용자 지정하고 싶을 때

대부분의 앱은 기본값에 의존할 수 있지만, HTML 스트리밍 같은 더 구체적인 작업을 하고 있다면 고려할 것이 있어요:

HTML 스트리밍

프록시는 압축하기 전에 응답을 버퍼링합니다. 이로 인해 예를 들어 점진적 서버 측 렌더링 같은 HTML 스트리밍이 깨질 수 있어요. 버퍼링을 피하려면 해당 응답에 Content-Encoding: none을 설정해 압축을 비활성화하세요:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Encoding: none

요약 (Summary)

Fly.io의 프록시는 구성 없이 빠르고 자동적인 압축을 제공합니다. 알아서 처리하게 두거나, 필요하면 제어권을 가질 수도 있어요. 압축 문제를 해결할 때 프록시가 어떻게 동작하는지 알면 원하는 결과를 얻는 데 도움이 됩니다.

문서에서 더 보기:

더 알아보기 (Learn more)