네트워크 트래픽을 줄이자, Apache gzip 사용

XML, JSON 방식으로 데이터를 전송할 때 그 크기가 1MB이상 되면 전송시간이 상당히 많이 걸리는 것을 볼 수 있다. 데이타 량이 많으면 트래픽이 늘어나고 특별히 웹호스팅을 받는 사람들에게는 트래픽량이 바로 금전적인 문제와 연관이 된다.

이 문제를 해결하기 위해 나는 Apache에서 지원하는 gzip을 이용했다.

문서파일은 Text형태이기 압축할 경우 80%~90%이상의 압축률을 보인다.
압축해서 데이타를 보내게 되면 데이터 전송시간도 줄겠지만 네트워크 트래픽도 줄어들어 일석이조의 효과를 본다.

참고로 gzip은 HTTP/1.1에서만 동작이 가능하다. 왜냐하면 HTTP/1.0에서는 gzip encoding이 지원되지 않기 때문이다.

여기서 나오는 예시는 웹호스팅을 받는 사람들에게 해당되지 않는다. 웹호스팅받은 사람은 왜냐하면 서버자체의 설정을 바꿀 수 있는 권한이 없기 때문이다. 하지만 PHP를 사용하는 사람중 트래픽문제로 고민하는 사람은
호스팅 사이트에서 gzip 압축 사용하기(http://qaos.com/article.php?sid=1684) 문서를 참고하기 바란다. 이 문서에서는 PHP에서 지원하는 gzip을 이용하여 데이터를 압축해서 전송하는 방법을 쓰고 있다.

1. gzip 설치

나는 안녕리눅스를 쓰기 때문에 패키지추가 기능을 이용하여 쉽게 Apache에서 구동되는 mod_gzip을 설치할 수 있었다. 만약 다른 리눅스를 쓴다면 자체 패키지추가 기능을 사용하거나 http://sourceforge.net/projects/mod-gzip/에서 다운받아 설치하기 바란다.

안녕리눅스에서는 다음과 같은 명령을 통해 gzip을 설치할 수 있다.

#pkgadd apache-gzip

2. gzip 설정변경

gzip을 사용하기 위해 안녕리눅스에서는 apache gzip 설정파일을 vi 에디터로 연다.

vi /etc/httpd/conf/module.d/gzip.conf

 

gzip.conf (Language : xml)
<IfModule mod_gzip.c>
# 이 기능을 사용하기 위해서는 상단의
# gzip_module 모듈을 활성화 시켜야 한다.

<IfModule mod_log_config.c>
# gzip 압축에 대한 로그
#
LogFormat “%h %l %u %t “%r” %>s %b “%{Referer}i” “%{User-Agent}i” mod_gzip: %{mod_gzip_result}n In:%{mod_gzip_input_size}n Out:%{mod_gzip_output_size}n:%{mod_gzip_compression_ratio}npct.” gzipcombined
CustomLog logs/access_gzip_log gzipcombined

</IfModule>

# HTTP 압축 전송 사용여부 설정
mod_gzip_on                   Yes

# Transfer-encoding: chunked 제거여부.
# Yes – 제거
# No  – 사용
mod_gzip_dechunk              Yes

# browser 가 protocol 의 정보를 가지고 있지 않을 경우
# 처리할 최소 http protocol level.
# 1000 – HTTP/1.0
# 1001 – HTTP/1.1
mod_gzip_min_http             1001

# 압축을 할 최소 파일 사이즈(byte)
mod_gzip_minimum_file_size    500
    # 압축을 할 최대 파일 사이즈(byte)
mod_gzip_maximum_file_size    0
# 압축을 할때 사용할 최대 메모리 사이즈(byte)
mod_gzip_maximum_inmem_size   100000

# 이미 전송한 파일의 보존여부
# Yes – 전송후 보존
# No  – 전송후 삭제
    mod_gzip_keep_workfiles       Yes

# 압축 설정
# ARG1 – mime,handler,file,uri,reqheader,rspheader
# ARG2 – 압축을 할 item
mod_gzip_item_include file    .css$
mod_gzip_item_include file    .js$
mod_gzip_item_include mime    ^text/.*
mod_gzip_item_include mime    ^image/.*
mod_gzip_item_include mime    ^application/x-httpd-php
    mod_gzip_item_exclude handler ^perl-script$
mod_gzip_item_exclude handler ^server-status$
mod_gzip_item_exclude handler ^server-info$

# 압축에서 제외할 설정
# ARG1 – mime,handler,file,uri,reqheader,rspheader
# ARG2 – 압축에서 제외할 item
#mod_gzip_item_exclude file    .css$
#mod_gzip_item_exclude file    .js$

# mod_gzip 이 작업을 할 임시 디렉토리. mod_gzip_keep_workfiles 을
# 설정했을 경우 이 파일들이 남아 있는 곳이기도 하다.
# Kernel 2.4 이상에서 shm 을 사용할 경우에는 /dev/shm 으로 지정을
# 한다. 최고 속도를 얻고 싶을 경우에는 RAM disk 를 지정한다.
mod_gzip_temp_dir             /dev/shm
</IfModule>

안녕리눅스에서는 gzip.conf 에 한글주석이 잘 되어 있어서 특별히 용어 해석의 어려움 없이 설정이 가능하다.

특별히  mod_gzip_minimum_file_size는 압축할 파일의 최소크기를 설정하는 건데 작은 용량의 파일은 압축하는 것자체가 무의미하고 또한 압축자체도 시간이 걸리는 문제이기 때문에 네트워크 트래픽과 압축하는 시간도 생각해서 적절한 값을 정하도록 하는게 중요하다.

그리고 압축설정에서 mod_gzip_item_include mime    ^application/x-httpd-php를 추가해서 php로 만들어진 Text문서가 압축되도록 했다.

mod_gzip_keep_workfiles       Yes를 NO로 바꾸자… /dev/shm은 용량이 제한되어 있기때문에 나중에 너무 로그가 쌓이면 문제가 생긴다. 

3. apache 재구동

설정된 변경 사항을 적용하기 위해서 apache를 재구동한다.

# service httpd reload

4. gzip 구동확인

이제 제대로 동작하는지 확인하는 절차가 남았다.
나는 XML 데이타를 만드는 PHP코드를 만들어서 웹브라우져에서 읽어올 수 있도록 했다.
그리고 /var/log/httpd/access_gzip_log 를 tail명령을 통해 실시간으로 보면서 gzip이 구동되는 것을 확인했다.

# tail -f /var/log/httpd/access_gzip_log
…(생략)
192.168.0.17 – – [04/Jul/2007:10:44:21 +0900] “GET 요청URL HTTP/1.1” 200 171765 “-” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)” mod_gzip: OK In:983469 Out:171765:83pct.

위와 같이 983KB나 되는 Text파일을 무려 171KB까지 압축해서 보냈다.
HTTP/1.1 방식을 사용하는 것도 확인할 수 있다.

5. 정리하기

대용량의 XML등의 Text문서를 자주 보내야하는 경우 분명 네트워크 트래픽 문제와 긴 전송시간 문제가 된다. 이 문제는 Apache에서 지원하는 gzip을 이용하면 80~90%이상의 압축파일로 데이타를 전송할 수 있기 때문에 트래픽과 전송시간을 급격히 줄이는 효과를 가질 수 있다. 용량이 작은 Text문서에는 사용하지 않는 편이 오히려 좋으며 이미 압축된 JPG파일과 같은 경우에는 압축할 필요가 없다.

6. 참고사이트

호스팅 사이트에서 gzip 압축 사용하기 : http://qaos.com/article.php?sid=1684
mod-gzip 다운로드 : http://sourceforge.net/projects/mod-gzip/
HTTP/1.1에 대한 문서 : ftp://ftp.nordu.net/rfc/rfc2616.txt
Description of all mod_gzip status codes : http://www.schroepl.net/projekte/mod_gzip/status.htm
mod_gzip 모듈 설치 방법 http://tong.nate.com/my_ju117/25190834

글쓴이 : 지돌스타 (http://blog.jidolstar.com/147)