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)gzipzstd(Zstandard)deflate
이 모두는 무손실입니다. 이것들은 암호화가 아니며, 청크 전송 인코딩과도 다릅니다. 단지 페이로드를 더 작게 만들 뿐이에요.
Fly.io 프록시가 지원하는 것
Fly.io 프록시는 에지에서 압축을 처리하며, 클라이언트와 프록시가 모두 지원하는 가장 효율적인 알고리즘을 자동으로 선택합니다. 우선순위는:
- Zstandard (zstd) — 성능과 크기 면에서 전반적으로 최고. Chrome과 Firefox에서 지원.
- Brotli — 여전히 훌륭하며 특히 텍스트에 좋음. 많은 경우 gzip보다 파일이 작아요.
- gzip — 폴백. 널리 지원됨.
- 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의 프록시는 구성 없이 빠르고 자동적인 압축을 제공합니다. 알아서 처리하게 두거나, 필요하면 제어권을 가질 수도 있어요. 압축 문제를 해결할 때 프록시가 어떻게 동작하는지 알면 원하는 결과를 얻는 데 도움이 됩니다.
문서에서 더 보기: