본문 바로가기
서버구축 (WEB,DB)

아파치 모듈 mod_gzip, mod_deflate 사용

by 날으는물고기 2009. 4. 9.

아파치 모듈 mod_gzip, mod_deflate 사용

출력을 버퍼링하는 ob_start()에 대해서 팁텍에서도 여러번 논의가 있었던 것으로 기억합니다.
특히 ob_start("ob_gzhandler");
를 이용하면 테이터를 gzip 압축을 해서 훨씬 빨라질거라는 이야기도 있었고...

저역시 ob_start("ob_gzhandler"); 해주고 압축이 잘되고 있다고 믿어왔습니다.

근데 우연히 http://www.whatsmyip.org/mod_gzip_test/ 에서 테스트를 해보니까 압축이 안되어있다고 나오더군요.
한참을 뒤지다가

Apache/1 에서는 별도로 mod_gzip을 설정해야한다는 사실을 알았습니다.


화일을 다운로드하고 설정하는 방법은 http://schroepl.net/projekte/mod_gzip/install.htm 에 자세히 나와있습니다.
소스를 다운 받아서 압축을 풀고
make
make install
하면 됩니다.

make
중 에러가 난다면 Makefile 화일을 열어서
APXS=your_apxs_pathname
부분을 수정해주셔야합니다.

설치가 되면
php.ini
화일에
LoadModule gzip_module          libexec/mod_gzip.so

AddModule mod_gzip.c

 <IfModule mod_gzip.c>
  mod_gzip_on                  Yes
  mod_gzip_can_negotiate        Yes
  mod_gzip_static_suffix        .gz
  AddEncoding              gzip .gz
  mod_gzip_update_static        No
  mod_gzip_command_version      '/mod_gzip_status'
  mod_gzip_keep_workfiles      No
  mod_gzip_minimum_file_size    500
  mod_gzip_maximum_file_size    500000
  mod_gzip_maximum_inmem_size  60000
  mod_gzip_min_http            1000
  mod_gzip_handle_methods        GET POST
  mod_gzip_item_exclude        reqheader  "User-agent: Mozilla/4.0[678]"
  mod_gzip_item_include        file      \.html$
  mod_gzip_item_exclude        file      \.js$
  mod_gzip_item_exclude        file      \.css$
  mod_gzip_item_include        file      \.pl$
  mod_gzip_item_include        handler    ^cgi-script$
  mod_gzip_item_include        mime      ^text/html$
  mod_gzip_item_include        mime      ^text/plain$
  mod_gzip_item_include        mime      ^httpd/unix-directory$
  mod_gzip_dechunk              Yes
  LogFormat                    "%h %l %u %t \"%V %r\" %<s %b mod_gzip: %{mod_gzip_result}n In:%{mod_gzip_input_size}n -< Out:%{mod_gzip_output_size}n = %{mod_gzip_compression_ratio}n pct." common_with_mod_gzip_info2
  CustomLog                    logs/mod_gzip.log common_with_mod_gzip_info2
  mod_gzip_add_header_count    Yes
  mod_gzip_send_vary            On
  </IfModule>

를 추가해줍니다.

아파치를 재가동하고
http://www.whatsmyip.org/mod_gzip_test/
에서 다시 테스트를 해보니 드디어 제대로 압축이 된 것을 확인할 수 있었습니다.
apache 1.x
에서는 mod_gzip이 설정되고 페이지에 ob_start("ob_gzhandler"); 가 있어야 압축이 됩니다.
ob_start("ob_gzhandler");
가 들어있지 않은 페이지는 압축이 일어나지 않습니다.


apache 2.x
에서는 ob_start("ob_gzhandler");를 하면 페이지가 먹통이 됩니다.

아파치 2.x에서는 mod_deflate를 설정해주셔야합니다.
송효진님이 이미 한번 언급을 하셨더군요.

http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=56751&sca=&sfl=wr_subject%7C%7Cwr_content&stx=mod_deflate&sop=and

송효진님처럼

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript text/css
하셔도 되고

<Location />
  <IfModule mod_deflate.c>
        SetOutputFilter DEFLATE
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4.0[678] no-gzip
        BrowserMatch bMSIE !no-gzip !gzip-only-text/html
        SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|rar|zip|gz|tar|exe)$ no-gz
  <IfModule mod_headers.c>
        Header append Vary User-Agent env=!dont-vary
  </IfModule>
  </IfModule>
</Location>

하셔도 됩니다.
2.x
에서는 ob_start("ob_gzhandler"); 와 상관없이 모든 페이지에서 작동합니다.

apache 1.x
에서 mod_gzip만 사용해도 압축할 수 있습니다. 설정파일에서 mod_gzip_item_include mime ^application/x-httpd-php만 지정하면 모든 php 파일이 압축되어 전달됩니다. 물론 다른 유형의 파일도 지정할 수 있습니다.

Apache2.x 이상에서 서버의 출력을 클라이언트에게 보낼 때 gzip 압축해서 전송하는 방법은 그리 어렵지 않다. Apache1.x 버전에서는 mod_gzip 모듈로 이런 일을 했었지만, Apache2.x 이상에서는 mod_deflate 모듈에서 이 일을 담당한다.

Apache 메뉴얼에 아주 상세한 설명이 나와있으니 자세한 내용은 메뉴얼을 참고하면 된다.

Debian에서는 mod_deflate 모듈이 apache2 패키지에 포함되어 있으므로 따로 설치할 필요는 없다.

/etc/apache2/mods-available 디렉토리에 가면 deflate.conf, deflate.load, headers.load 파일들이 있음을 확인하고, /etc/apache2/mods-enabled 디렉토리에 소프트 링크만 걸어주면 된다.

그리고, /etc/apache2/sites-available/default 파일 혹은 적용할 사이트 설정 파일에 아래와 같은 내용을 추가하면 된다.

<Directory /var/www/something/>
    SetOutputFilter DEFLATE
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4.0[678] no-gzip
    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

    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript
</Directory>

위 설정은 Apache 메뉴얼에 나와있는 그대로이다. 마지막 줄의 AddOutputFilterByType 항목만 조금 수정한 것이다.
728x90

댓글