Apache HTTP Server Version 2.0

Apache > HTTP Server > Documentation > Version 2.0 > 모듈

# 아파치 모듈 mod_deflate

가능한 언어: en | ja | ko

설명: | 내용을 클라이언트로 보내기 전에 압축한다
상태: | Extension
모듈명: | deflate_module
소스파일: | mod_deflate.c

### 요약

`mod_deflate` 모듈은 서버의 출력을 네트웍으로 클라이언트에 보내기 전에 압축하는 `DEFLATE` 출력필터를 제공한다.

### 지시어들

### 주제

- 권장하는 설정
- 압축하기
- 프록시 서버 다루기

### 참고

- 필터

## 권장하는 설정

급한 사람을 위한 견본 설정이다.

### 일부 type만 압축

`AddOutputFilterByType DEFLATE text/html text/plain text/xml`

아래 설정은 요약하였지만 그래도 복잡하다. 설정을 완전히 이해한 후 사용하라.

### 이미지를 제외한 모든 것을 압축

`<Location />
# 필터를 추가한다
SetOutputFilter DEFLATE
# Netscape 4.x에 문제가 있다...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08에 더 문제가 있다
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE은 Netscape라고 자신을 알리지만, 문제가 없다
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# 주의: 아파치 2.0.48까지 mod_setenvif의 버그때문에
# 위의 정규표현식은 동작하지 않는다. 원하는 효과를
# 얻기위해 다음과 같이 수정하여 사용한다:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# 이미지를 압축하지 않는다
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
# 프록시가 잘못된 내용을 전달하지않도록 한다
Header append Vary User-Agent env=!dont-vary
</Location>`

## 압축하기

### 출력 압축

`DEFLATE` 필터가 압축을 한다. 다음 지시어는 지시어가 있는 위치의 문서를 압축한다:

`SetOutputFilter DEFLATE`

모든 내용을 압축하면 처리하지 못하는 브라우저가 있기때문에 html 파일만을 압축하기위해 (아래 참고) `gzip-only-text/html`을 `1`로 설정할지도 모른다. 이를 `1`이 아닌 값으로 설정하면 무시한다.

보통 특별한 MIME type만 압축하려면 `AddOutputFilterByType` 지시어를 사용한다. 다음 설정은 html 파일만을 압축한다:

`<Directory "/your-server-root/manual">
AddOutputFilterByType DEFLATE text/html
</Directory>`

압축한 파일을 처리하지 못하는 브라우저에게는 압축하지않고 보내길위해 `BrowserMatch` 지시어에 `no-gzip`을 설정한다. 최적의 결과를 얻기위해 `no-gzip`과 `gzip-only-text/html`을 같이 사용할 수 있다. 이 경우 전자가 후자를 무시한다. 위 절의 설정 예제 일부를 살펴보자:

`BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html`

먼저 `User-Agent` 문자열을 보고 Netscape Navigator 버전 4.x인지 검사한다. 이 버전은 `text/html`이 아닌 type의 압축을 처리하지 못한다. 버전 4.06, 4.07, 4.08은 html 파일 압축을 처리하는대도 문제가 있다. 그래서 우리는 이 경우 deflate 필터를 완전히 사용하지않는다.

세번째 `BrowserMatch` 지시어는 Microsoft Internet Explorer가 자신을 "Mozilla/4"로 알리지만 압축된 요청을 처리할 수 있기때문에 user agent 추측을 수정한다. `User-Agent` 헤더에서 "MSIE" (`\b`는 "단어 경계"를 뜻한다) 문자열을 발견하면 앞에서 설정한 제약을 푼다.

### 주의

`DEFLATE` 필터는 항상 PHP나 SSI와 같은 RESOURCE 필터 뒤에 들어간다. 또, 내부 하위요청(subrequest)에 영향을 주지 않는다.

### 입력 압축풀기

`mod_deflate` 모듈은 gzip으로 압축된 요청 내용을 푸는 필터도 제공한다. 이 기능을 사용하려면 다음과 같이 `SetInputFilter`나 `AddInputFilter`를 사용하여 입력필터순서에 `DEFLATE` 필터를 추가한다.

`<Location /dav-area>
SetInputFilter DEFLATE
</Location>`

요청에 `Content-Encoding: gzip` 헤더가 있다면 자동으로 압축된 내용을 푼다. gzip 요청을 할 수 있는 브라우저는 드물다. 그러나 어떤 WebDAV 클라이언트와 같은 특별한 프로그램은 요청 압축을 지원한다.

### Content-Length에 대한 주의

요청 내용을 직접 살펴본다면, `Content-Length` 헤더를 믿지마라! Content-Length 헤더는 클라이언트가 보낸 내용의 길이이지, 압축을 푼 결과의 바이트수가 아니다.

## 프록시 서버 다루기

`mod_deflate` 모듈은 프록시가 자신이 캐쉬한 응답을 적절한 `Accept-Encoding` 요청 헤더를 보낸 클라이언트에게만 보내도록 `Vary: Accept-Encoding` HTTP 응답 헤더를 추가한다. 그래서 압축된 내용을 이해할 수 없는 클라이언트에 압축된 내용을 보내지않도록 한다.

예를 들어, `User-Agent` 헤더 등에 따라 특별히 필터 적용을 취소한다면, 프록시에게 이러한 제한을 알려주기위해 직접 `Vary` 헤더에 추가해야 한다. 예를 들어, 설정이 `User-Agent`에 따라 `DEFLATE` 필터를 추가한다면 다음을 사용한다:

`Header append Vary User-Agent`

요청 헤더외의 다른 정보에 (예를 들어, HTTP 버전) 따라 압축 여부가 결정된다면, `Vary` 헤더값을 `*`로 설정해야 한다. 그러면 표준을 따르는 프록시는 캐쉬를 하지 않게 된다.

### 예제

`Header set Vary *`

## DeflateBufferSize 지시어

설명: | zlib이 한번에 압축할 크기
문법: | `DeflateBufferSize value`
기본값: | `DeflateBufferSize 8096`
사용장소: | 주서버설정, 가상호스트
상태: | Extension
모듈: | mod_deflate

`DeflateBufferSize` 지시어는 zlib이 한번에 압축할 바이트수를 지정한다.

## DeflateCompressionLevel 지시어

설명: | 출력을 어느정도 압축하는가
문법: | `DeflateCompressionLevel value`
기본값: | `Zlib's default`
사용장소: | 주서버설정, 가상호스트
상태: | Extension
모듈: | mod_deflate
지원: | This directive is available since Apache 2.0.45

`DeflateCompressionLevel` 지시어는 사용할 압축수준을 선택한다. 값이 클수록 압축률이 증가하지만, CPU를 더 많이 사용한다.

(가장 덜 압축) 1과 (가장 많이 압축) 9 사이의 값을 지정한다.

## DeflateFilterNote 지시어

설명: | 압축률을 로그에 기록한다
문법: | `DeflateFilterNote [type] notename`
사용장소: | 주서버설정, 가상호스트
상태: | Extension
모듈: | mod_deflate
지원: | type is available since Apache 2.0.45

`DeflateFilterNote` 지시어는 요청의 압축률을 로그에 기록하는 기호를 지정한다. 기호 이름은 지시어로 지정한 값이다. 통계를 위해 접근 로그에서 기호를 사용할 수 있다.

### 예제

`DeflateFilterNote ratio
LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
CustomLog logs/deflate_log deflate`

로그에서 더 정확한 값을 추출하려면 type 아규먼트로 기록할 자료를 선택한다. type는 다음중 하나이다:

`Input`
  필터 입력스트림의 바이트수를 저장한다.
`Output`
  필터 출력스트림의 바이트수를 저장한다..
`Ratio`
  압축률을 (`output/input * 100`) 저장한다. type 아규먼트를 생략하면 사용하는 기본값이다.

그래서 이렇게 로그에 기록할 수 있다:

### 정밀한 로그

`DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog logs/deflate_log deflate`

### 참고

- `mod_log_config`

## DeflateMemLevel 지시어

설명: | zlib이 압축할때 사용하는 메모리량
문법: | `DeflateMemLevel value`
기본값: | `DeflateMemLevel 9`
사용장소: | 주서버설정, 가상호스트
상태: | Extension
모듈: | mod_deflate

`DeflateMemLevel` 지시어는 zlib이 압축할때 얼마만큼 메모리를 사용할지 결정한다. (1과 9 사이의 값)

## DeflateWindowSize 지시어

설명: | Zlib 압축 window size
문법: | `DeflateWindowSize value`
기본값: | `DeflateWindowSize 15`
사용장소: | 주서버설정, 가상호스트
상태: | Extension
모듈: | mod_deflate

`DeflateWindowSize` 지시어는 zlib 압축 window size를 (1과 15 사이의 값) 지정한다. 일반적으로 window size가 클수록 압축률이 증가한다.

가능한 언어: en | ja | ko