Nginx 압축 마스터하기: 웹 성능을 위한 Gzip vs. Brotli

Gzip과 Brotli 알고리즘을 비교하여 Nginx 콘텐츠 압축을 마스터하세요. 둘 다 활성화하기 위한 실용적인 구성 지시문을 배우고, 성능 트레이드오프를 이해하며, 정적 Brotli 파일 사용과 같은 모범 사례를 통해 웹 서버에서 대역폭 사용량을 획기적으로 줄이고 콘텐츠 전송을 가속화하는 방법을 알아보세요.

53 조회수

Nginx 압축 마스터하기: 웹 성능을 위한 Gzip vs. Brotli

웹 성능 최적화는 사용자 유지와 SEO 순위에 매우 중요합니다. 지연 시간과 대역폭 소비를 줄이는 가장 효과적인 방법 중 하나는 웹 자산을 클라이언트로 전송하기 전에 압축하는 것입니다. 고성능 웹 서버인 Nginx는 두 가지 주요 모듈인 Gzip과 더 현대적인 Brotli를 통해 콘텐츠 압축을 강력하게 지원합니다.

이 가이드는 Nginx 내에서 이러한 압축 방법이 어떻게 작동하는지, 구성 세부 정보, 그리고 어떤 알고리즘이 인프라 및 성능 목표에 가장 적합한지 결정하는 데 도움이 되는 직접적인 비교를 제공합니다. 압축을 마스터하면 사용자들의 연결 속도에 관계없이 더 빠른 로딩 시간과 더 나은 경험을 보장합니다.

Nginx에서 웹 압축 이해하기

압축은 데이터(예: HTML, CSS 또는 JavaScript 파일)에서 반복되는 패턴을 찾아 더 짧은 참조로 대체함으로써 작동합니다. 이는 네트워크를 통해 전송되는 파일의 총 크기를 줄여줍니다. Nginx는 중간자 역할을 하여 데이터를 브라우저로 보내기 전에 선택된 압축 알고리즘을 동적으로 적용합니다.

Nginx는 일반적으로 ngx_http_gzip_module(Gzip) 또는 ngx_http_brotli_module(Brotli)이 바이너리에 컴파일되어 있어야 합니다. 대부분의 최신 미리 빌드된 Nginx 패키지에는 Gzip 지원이 기본적으로 포함되어 있지만, Brotli는 종종 명시적인 설치 또는 컴파일 플래그가 필요합니다.

필수 조건

Brotli를 사용할 계획이라면 Nginx 설치가 Brotli를 지원하는지 확인하십시오. Brotli 사용 가능 여부는 다음 명령을 실행하여 확인할 수 있습니다.

nginx -V 2>&1 | grep --color=always brotli

출력에 --with-http_brotli_module이 표시되면 진행할 준비가 된 것입니다.

1. Gzip 압축 구성하기

Gzip은 콘텐츠 압축을 위한 성숙하고 널리 지원되는 표준입니다. 이는 압축률과 CPU 오버헤드 사이에서 좋은 균형을 제공합니다.

Nginx 구성에서 Gzip 활성화하기

Gzip 설정은 일반적으로 Nginx 구성 파일(nginx.conf 또는 포함된 구성 파일)의 http, server 또는 location 블록 내에 배치됩니다.

Gzip 압축을 활성화하려면 다음 지시문을 사용하십시오.

http {
    # Gzip 압축 활성화
    gzip on;

    # 압축할 최소 응답 크기 설정 (바이트)
    # 1000바이트보다 큰 파일만 압축
    gzip_min_length 1000;

    # 압축 수준 (1=가장 빠름/가장 낮은 압축, 9=가장 느림/가장 높은 압축)
    gzip_comp_level 6;

    # 압축할 MIME 유형 지정
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;

    # 권장: 프록시가 압축 및 비압축 버전을 모두 캐시하도록 Vary: Accept-Encoding 헤더 전송
    gzip_vary on;

    # 권장: 식별을 위해 gzip 헤더 추가
    gzip_proxied any;
}

주요 Gzip 지시문 설명:

  • gzip on;: Gzip 모듈을 활성화합니다.
  • gzip_comp_level: 이 값을 4에서 6 사이로 설정하는 것이 종종 성능에 가장 적합합니다. 수준이 높을수록 대역폭을 더 절약하지만 서버의 CPU 사용량이 증가합니다.
  • gzip_types: 결정적으로, 이미지(.jpg, .png, .gif)나 비디오와 같이 이미 압축된 형식은 절대 압축해서는 안 됩니다.

2. Brotli 압축 구성하기

Brotli는 Google에서 개발한 최신 압축 알고리즘입니다. 일반적으로 Gzip보다 훨씬 더 나은 압축률(종종 15-25% 더 작은 파일)을 달성하며, 특히 미리 압축된 파일이나 캐시의 경우 유사하거나 약간 더 높은 CPU 비용이 듭니다.

Nginx 구성에서 Brotli 활성화하기

Brotli 구성은 유사한 지시문을 사용하지만 gzipbrotli로 대체합니다.

brotli on;
brotli_comp_level 6; # 일반적으로 4에서 8 사이가 권장됨
brotli_static on; # 미리 압축된 .br 파일이 있는 경우 제공 활성화
brotli_types text/plain text/css application/json application/javascript application/x-javascript text/xml;

사전 압축(brotli_static)에 대한 중요 참고 사항:

Brotli 압축은 모든 요청에 대해 즉석에서 수행될 경우 CPU 집약적일 수 있습니다. 일반적인 모범 사례는 전용 오프라인 도구(예: brotli 명령줄 유틸리티)를 사용하여 자산을 사전 압축하고 원본 파일(예: style.cssstyle.css.br)과 함께 .br 버전을 저장하는 것입니다.

brotli_static on;을 설정하면 Nginx는 요청된 리소스에 대해 미리 압축된 .br 파일이 있는지 확인하고, 클라이언트가 Brotli를 지원하는 경우 실시간 처리를 완전히 우회하여 해당 파일을 직접 제공하도록 지시합니다.

3. Gzip vs. Brotli: 올바른 선택하기

Gzip과 Brotli 중 선택은 클라이언트 지원 및 서버 리소스에 크게 좌우됩니다.

기능 Gzip Brotli 권장 사항
압축률 좋음 탁월함 (15-25% 더 우수) Brotli 승
CPU 부하 (즉석 처리) 낮음 중간에서 높음 Gzip이 더 가벼움
클라이언트 지원 거의 보편적 (모든 최신 브라우저) 매우 높음 (대부분의 최신 브라우저) Gzip이 레거시 지원에 더 안전함
사전 압축 가능하지만 덜 일반적 강력 권장 (brotli_static) 가능하다면 Brotli 사전 압축 사용

하이브리드 접근 방식: 모범 사례

가장 강력한 현대적 구성은 하이브리드 설정을 사용하여 최신 클라이언트에는 Brotli를 우선시하고, Gzip을 안정적인 대체 옵션으로 제공합니다.

  1. Brotli 우선순위 지정: 속도를 위해 brotli_static on;을 사용하여 Brotli를 먼저 구성합니다.
  2. Gzip으로 대체: Brotli를 지원하지 않는 클라이언트를 처리하도록 Gzip이 활성화되고 구성되었는지 확인합니다.

Nginx는 클라이언트가 보낸 Accept-Encoding 헤더를 기반으로 사용 가능한 최상의 옵션을 자동으로 제공합니다.

하이브리드 구성 예시

Nginx 버전이 두 모듈을 모두 지원하는 경우, 둘 다 동시에 활성화할 수 있습니다. Nginx는 클라이언트의 요청 헤더를 기반으로 어떤 모듈이 콘텐츠를 제공할지 우선순위를 정합니다.

http {
    # --- Brotli 구성 (높은 우선순위/더 나은 압축) ---
    brotli on;
    brotli_comp_level 6;
    brotli_static on; # Brotli 성능에 매우 중요함
    brotli_types text/plain application/javascript application/json;

    # --- Gzip 구성 (대체) ---
    gzip on;
    gzip_comp_level 5;
    gzip_vary on;
    gzip_proxied any;
    gzip_types text/css application/xml;

    # 참고: 예기치 않은 동작을 피하기 위해 MIME 유형 목록이 완벽하게 겹치지 않도록 하십시오.
    # Nginx가 일반적으로 이를 지능적으로 처리하지만 말입니다.
}

성능 튜닝 팁

어떤 알고리즘을 선택하든, 최대의 효과를 위해 다음 모범 사례를 따르십시오.

1. 클라이언트 지원 확인

항상 Vary: Accept-Encoding 헤더를 사용하여 클라이언트가 압축을 요청했는지 확인하십시오. 이 헤더가 없으면 프록시가 파일의 잘못된 버전을 잘못 캐시할 수 있습니다. gzip_vary on;은 Gzip의 경우 이를 처리합니다.

2. 과도한 압축 피하기

서버가 심하게 유휴 상태가 아니라면 gzip_comp_level 또는 brotli_comp_level을 너무 높게(예: 9 또는 11) 설정하지 마십시오. 파일 크기 감소의 미미한 이득은 계산에 필요한 추가 CPU 주기만큼 가치가 거의 없습니다.

3. 사전 압축 파일 캐싱

Brotli의 경우 brotli_static on;을 사용하고 정적 자산을 사전 압축하는 것이 단일 성능에서 가장 큰 이점입니다. 이는 CPU 부하를 요청 시간에서 배포 시간으로 전환합니다.

4. 구성 테스트

Nginx 구성을 수정한 후에는 항상 다시 로드하기 전에 구문을 테스트하십시오.

sudo nginx -t

성공하면 Nginx를 다시 로드하여 변경 사항을 적용하십시오.

sudo systemctl reload nginx

온라인 도구(GTmetrix 또는 WebPageTest와 같은)를 사용하여 응답이 실제로 Content-Encoding: gzip 또는 Content-Encoding: br 헤더와 함께 제공되는지 확인하십시오.

결론

Nginx는 웹을 통해 전송되는 데이터의 크기를 줄이는 정교한 도구를 제공합니다. Gzip이 보편적으로 안전한 선택으로 남아있지만, 특히 사전 압축된 자산에 brotli_static을 활용할 때 Brotli는 우수한 압축 효율성을 제공하여 선호되는 현대적 표준이 됩니다. 하이브리드 접근 방식을 구현하고 압축 수준을 적절하게 조정함으로써 애플리케이션의 응답 시간을 크게 향상시키고 세계적 수준의 성능 경험을 제공할 수 있습니다.