ngx_http_gzip_module 모듈을 통한 대용량 응답 압축으로 응답 속도 개선

이번 블로그 포스트에서는 NGINX Gzip 모듈인 ngx_http_gzip_module 을 이용해 대용량 응답을 압축하여 클라이언트에 전달하는 방법을 소개합니다. ngx_http_gzip_module을 사용하면 웹 서버의 네트워크 트래픽을 절감하고, 클라이언트에 더 빠르게 콘텐츠를 전달할 수 있습니다.

기본적인 NGINX 설정 방법, 주의사항, 그리고 모듈이 제공하는 다양한 옵션을 다루어 실제 웹 환경에서 쉽게 적용할 수 있도록 가이드 합니다.

목차

1. NGINX의 ngx_http_gzip_module 모듈 개요
 1-1. ngx_http_gzip_module의 역할과 기능
 1-2. Gzip을 통해 최적화할 수 있는 콘텐츠 유형
2. NGINX에서 ngx_http_gzip_module 을 통해 Gzip 모듈 설정하기
 2-1. 기본 ngx_http_gzip_module 옵션 설명
 2-2. gzip_types와 지원 파일 유형 설정
 2-3. gzip_min_length로 최소 압축 크기 설정
3. 실제 NGINX 구성 예시
 3-1. 기본 Gzip 설정 NGINX 샘플 코드
 3-2. 대용량 데이터베이스 쿼리 응답 구성
 3-3. ngx_http_gzip_module 모듈과 프록시 서버 간의 상호작용
4.결론

1. NGINX의 ngx_http_gzip_module 모듈 개요

NGINX의 ngx_http_gzip_module은 웹 서버가 클라이언트로 전달하는 응답 데이터를 압축하여 네트워크 사용량을 줄이고, 콘텐츠 전달 속도를 개선하는 데 도움을 줍니다. 특히 텍스트 기반의 데이터는 압축 효율이 높아, 웹 애플리케이션의 성능을 최적화하는 데 유용하게 활용할 수 있습니다.

1-1. ngx_http_gzip_module의 역할과 기능

ngx_http_gzip_module은 서버에서 전송하는 응답을 압축하여 클라이언트가 데이터를 더 빠르게 로드할 수 있도록 돕는 역할을 합니다. 이 모듈은 설정을 통해 특정 파일 유형을 대상으로 압축을 수행하며, gzip_min_length 옵션 등을 사용하여 압축을 적용할 데이터 크기 기준을 지정할 수 있습니다. 이와 같은 설정 옵션을 통해 관리자는 서버 자원을 절약하면서도 클라이언트에 최적화된 데이터를 제공할 수 있습니다.

1-2. Gzip을 통해 최적화할 수 있는 콘텐츠 유형

Gzip 모듈을 통해 가장 효과적으로 최적화할 수 있는 콘텐츠는 HTML, CSS, JavaScript, JSON 등 텍스트 기반의 파일들입니다.

이러한 파일들은 Gzip 압축률이 높아 대용량 콘텐츠일수록 데이터 크기를 크게 줄일 수 있습니다. 반면, 이미지, 비디오와 같은 바이너리 파일은 이미 다른 형태의 압축이 적용되어 있어 Gzip으로 추가 압축할 때 효과가 미미합니다. 따라서 Gzip 모듈을 사용 시, 이러한 텍스트 기반 콘텐츠 유형에 집중하여 압축을 설정하는 것이 효율적입니다.

2. NGINX에서 ngx_http_gzip_module 을 통해 Gzip 모듈 설정하기

NGINX의 ngx_http_gzip_module을 사용하여 서버의 응답을 효율적으로 압축하려면, 여러 설정 옵션을 통해 모듈의 기능을 세부적으로 조정할 수 있습니다.

이번 목차에서는 기본적인 Gzip 설정 옵션과 파일 유형 설정, 그리고 최소 압축 크기 설정에 대해 알아봅니다.

2-1. 기본 ngx_http_gzip_module 옵션 설명

gzip            on;
gzip_min_length 1000;
gzip_proxied    expired no-cache no-store private auth;
gzip_types      text/plain application/xml;

gzip_disable, gzip_proxied 등의 추가 옵션을 통해 특정 클라이언트에서 압축을 비활성화하거나 프록시 서버와의 연동을 조정하는 등, 다양한 상황에 맞춘 세부 설정이 가능합니다. 이러한 옵션을 통해 서버 자원과 네트워크 트래픽을 효율적으로 관리할 수 있습니다.

Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location

ngx_http_gzip_module의 기본 설정 옵션에는 Gzip 압축 기능을 활성화하는 gzip on; 명령어가 포함됩니다. 이 옵션을 통해 서버가 응답 데이터를 압축해 클라이언트에 전달하도록 설정할 수 있습니다.

Syntax: gzip_min_length length;
Default: gzip_min_length 20;
Context: http, server, location

gzip_min_length 지시어는 NGINX에서 gzip 압축을 적용할 응답의 최소 길이를 설정하는 옵션입니다. 이 값은 응답 헤더의 "Content-Length" 필드에 명시된 길이로만 결정됩니다. 즉, 설정한 바이트 길이 이상인 응답에 대해서만 gzip 압축을 적용합니다.

Syntax:  gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth |
         any ...;
Default: gzip_proxied off;
Context: http, server, location

gzip_proxied 지시어는 NGINX에서 프록시된 요청에 대한 응답을 압축할지 여부를 결정하는 데 사용됩니다. 요청이 프록시된 것으로 간주되는 기준은 요청 헤더에 "Via" 필드가 포함되어 있는지 여부로 판단됩니다. 이 지시어는 여러 매개변수를 허용하며 각 옵션은 아래와 같은 의미를 가집니다.

  1. off
    • 모든 프록시된 요청에 대한 압축을 비활성화합니다. 다른 매개변수는 무시됩니다.
  2. expired
    • 응답 헤더에 "Expires" 필드가 있고, 그 값이 캐싱을 비활성화하는 경우 압축을 허용합니다. 만료된 응답에만 압축을 적용하는 경우에 유용합니다.
  3. no-cache
    • 응답 헤더에 "Cache-Control" 필드가 있고, 그 값에 "no-cache" 파라미터가 포함된 경우 압축을 허용합니다. 캐싱이 불가한 데이터를 대상으로 합니다.
  4. no-store
    • 응답 헤더에 "Cache-Control" 필드가 있고, 그 값에 "no-store" 파라미터가 포함된 경우 압축을 허용합니다. 저장이 불가능한 데이터를 대상으로 합니다.
  5. private
    • 응답 헤더에 "Cache-Control" 필드가 있고, 그 값에 "private" 파라미터가 포함된 경우 압축을 허용합니다. 개인적인 캐시 전용 데이터를 대상으로 합니다.
  6. no_last_modified
    • 응답 헤더에 "Last-Modified" 필드가 포함되지 않은 경우 압축을 허용합니다. 이 설정은 데이터가 변경된 시점을 나타내는 필드가 없을 때 유용합니다.
  7. no_etag
    • 응답 헤더에 "ETag" 필드가 포함되지 않은 경우 압축을 허용합니다. "ETag"가 없는 경우에만 압축을 적용하고자 할 때 유용합니다.
  8. auth
    • 요청 헤더에 "Authorization" 필드가 포함된 경우 압축을 허용합니다. 인증된 요청의 응답에 대해 압축을 수행하는 옵션입니다.
  9. any
    • 모든 프록시된 요청에 대해 압축을 허용합니다.

이 설정을 통해 특정 조건에 따라 프록시된 요청에 대한 응답을 압축할 수 있어, 캐시 설정이나 인증 여부에 맞춰 압축 효율을 높일 수 있습니다.

Syntax:  gzip_types mime-type ...;
Default: gzip_types text/html;
Context: http, server, location

gzip_types 지시어는 NGINX에서 지정된 MIME 유형에 대해 gzip 압축을 활성화하는 데 사용됩니다. 기본적으로 text/html 유형의 응답은 항상 압축됩니다.

ngx_http_gzip_module 모듈의 기타 옵션에 대해서는 NGINX STORE의 ngx_http_gzip_module Docs를 참고하세요.

2-2. gzip_types와 지원 파일 유형 설정

gzip_types 옵션을 사용하여 NGINX가 압축할 콘텐츠 유형을 지정할 수 있습니다.

이 옵션은 text/html, application/json, text/css 등과 같이 텍스트 기반 파일 유형을 설정하여 해당하는 응답 데이터만 압축하도록 합니다. 적절한 파일 유형을 지정하면 불필요한 파일의 압축을 피하면서도 성능 최적화를 달성할 수 있습니다.

특히 JSON, CSS, JavaScript와 같은 파일은 압축률이 높아 웹 애플리케이션 성능 향상에 효과적입니다.

2-3. gzip_min_length로 최소 압축 크기 설정

gzip_min_length 옵션은 압축할 데이터의 최소 크기를 설정하여, 작은 파일에 대해 불필요한 압축 작업이 수행되지 않도록 합니다.

이 설정은 주로 작은 파일의 경우 압축으로 인해 오히려 서버의 자원을 낭비할 가능성이 있는 경우에 유용하게 사용됩니다. 예를 들어, gzip_min_length 10000;와 같이 설정하면 10KB 이상의 데이터에만 압축을 적용하여, 서버의 CPU 사용률을 절약하면서도 일정 크기 이상 데이터에만 압축 효과를 극대화할 수 있습니다.

gzip_min_length 지시어의 단위는 바이트만 지원됩니다. 따라서 MBGB 단위는 직접 사용할 수 없습니다. 하지만 MB나 GB 단위로 설정하려면 해당 단위를 바이트로 변환하여 사용하면 됩니다.

예를 들어:

  • 1 MB = 1,048,576 바이트
  • 1 GB = 1,073,741,824 바이트

이를 적용하면 다음과 같이 설정할 수 있습니다.

gzip_min_length 1048576;  # 1 MB
gzip_min_length 1073741824; # 1 GB

3. 실제 NGINX 구성 예시

이 목차에서는 실제 NGINX 설정 파일을 통해 ngx_http_gzip_module을 활용하는 방법을 설명합니다.

샘플 코드를 기반으로 NGINX Gzip 설정을 이해하고, 대용량 데이터베이스 쿼리 응답의 압축 구성 및 프록시 서버와의 상호작용에서 Gzip 모듈이 어떤 역할을 하는지 살펴봅니다.

3-1. Gzip 설정 NGINX 샘플 코드

NGINX STORE GitHub: http_gzip.conf

upstream backend {
    server 192.168.201.133:3000;
}

server {
        listen 80;
        server_name example.com;
        access_log /var/log/nginx/access/host.access.log main;

        location / {
	    gzip on;
	    gzip_types	application/json text/plain;
	    gzip_min_length 1000;
            proxy_pass http://backend$request_uri;
        }
}

위 구성은 ngx_http_gzip_module 모듈을 통해 Gzip 압축을 활성화 한 NGINX 예제 구성입니다.

3-2. 대용량 데이터베이스 쿼리 응답 구성

약 30만개의 대용량 더미 데이터를 가지고 있는 데이터베이스 쿼리 및 쿼리를 출력하는 백엔드 웹 서버를 준비합니다.

데이터베이스 Query 시간은 0.38초에 걸려 30만개 가량의 데이터가 조회됩니다.

해당 웹 페이지는 JSON 응답으로 이루어져 있으며, 35MB 가량 데이터가 전송된 것을 확인할 수 있습니다.

3-3. ngx_http_gzip_module 모듈과 프록시 서버 간의 상호작용

ngx_http_gzip_module이 활성화 된 NGINX 서버로 접속하여 모듈과 프록시 서버 간 상호작용을 통해 요청이 Gzip 압축이 되어 반환되는 응답을 확인할 수 있습니다.

ngx_http_gzip_module 모듈을 통해 데이터가 압축되어 약 5.3MB가 클라이언트에게 반환되는 것을 확인할 수 있습니다.

이는 NGINX Access Logs의 body size 비교로도 확인할 수 있습니다.

gzip 옵션 비활성화, body size 35888896 bytes
gzip 옵션 활성화, body size 5257743 bytes

4. 결론

이번 포스트에서는 ngx_http_gzip_module을 활용한 NGINX의 Gzip 설정과 실제 구성 예시를 살펴보았습니다. 적절한 설정을 통해 네트워크 사용량을 줄일 수 있으며, 특히 대용량 데이터를 다루는 웹 애플리케이션에서 성능을 효과적으로 최적화할 수 있습니다.

이 모듈을 적용하면서 알아두어야 할 핵심 설정과 유의사항을 요약하며, Gzip 압축의 실제 적용 효과를 검토해 보았습니다.

NGINX의 다양한 모듈을 통해 NGINX를 동적으로 구성하고 싶으신가요? NGINX STORE 블로그의 NGINX 카테고리를 참고하거나 NGINX STORE에 문의하여 사용 사례에 맞는 NGINX 모듈을 상담 받아보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required