'deflate'에 해당되는 글 2건

  1. 2009.05.13 아파치 ETag 이용한 정적파일 최적화 (2)
  2. 2009.04.09 아파치 모듈 mod_gzip, mod_deflate 사용 (1)
2009.05.13 20:34

아파치 ETag 이용한 정적파일 최적화

ETag는 Http1.1 에서 새롭게 등장한 header값인데 브라우져 캐쉬에 저장된 파일과 웹서버의 파일이 일치하는지를 판단하기 위한 방법중에 하나이다.

보통 ETag는 파일을 구분하기 위해 inode 값을 사용하는데 이게 여러대의 웹서버를 운영하는 환경에서는 접근하는 서버에 따라 inode 값이 다르기때문에 ETag 값도 달라기게 된다.

브라우져는 캐쉬된 파일의 갱신여부를 확인하기 위해서 수정일자와 ETag값을 사용하게 되는데 (이중에서 ETag값을 먼저 비교하고 수정일자를 나중에 비교한다.) 위와 같이 여러대의 서버를 사용하는 환경에서는 ETag값이 다르게 인식되어 다른 서버에 접근하게 되면 캐쉬를 지우고 새로 받게 된다.

많은 웹서버를 쓰는 환경에서는 캐쉬효율이 떨어져서 응답 속도가 느려질수 있다.
하여 보통 Inode 값을 빼던지 아예 ETag를 제거하든지 하는데..
우리는 ETag를 제거하여 사용하고 있다.

아래는 제거하는 설정이다.
이때 주의할점은 아파치 options의 -Indexes 설정을 추가하게 되면
ETag가 지워지지 않는다는 것이다. 반드시 Indexes 속성을 제거해줘야한다.

<vhost *>

...

FileETag None

#  <Directory "/env/tomcat4/webapps/section">
#    Options FollowSymLinks MultiViews #-Indexes 삭제해야함.
#    AllowOverride None
#    Order deny,allow
#    Allow from all
#    DirectoryIndex SectionMain.nhn
#  </Directory>

# expire 설정

#  <FilesMatch "\.(js|css|swf|gif|jpg)$">
#    ExpiresActive On
#    ExpiresDefault "access plus 1 years"
#  </FilesMatch>

# contents 압축설정
#  <Location />

#   AddOutputFilterByType DEFLATE text/html text/css application/x-javascript
#  </Location>

</vhost>

Apache 웹서버의 기본 ETag 값은 INode, MTime, Size 입니다. 한대의 웹서버로 운영을 할 경우는 문제가 없으나,  L4 장비를 통하여 로드밸런싱을 할 경우는 각 서버별로 INode 값이 다르기에 동일 이미지에 대하여 ETag 값이 다르기에 클라이언트에서 캐쉬된 정보를 사용하는 것이 아닌 서버에 재 요청을 하게 됩니다.

httpd.conf 에 아래와 같이 FileETag 값을 변경 후에 이미지서버의 네크워크 사용량이 아주 급격하게 줄어든 것을 확인 하실 수 있습니다. ( CVN 서비스를 사용할 경우는 반드시 설정하여 사용하시길 )

FileETag MTime Size

참고

  • http://httpd.apache.org/docs/2.0/mod/core.html#fileetag

Trackback 0 Comment 2
  1. 궁금이 2009.07.28 11:16 address edit & del reply

    근데, 정적페이지에서 정작 로컬캐쉬된게 아니라, 서버에 있는걸 가져다 쓰게 하려면 eTags는 없애고, expire되는 설정으로 조절을 해야 하나요?? expire는 특정이미지만 처리를 할수 있나요??

    • Favicon of https://blog.pages.kr 날으는물고기 2009.07.28 13:43 신고 address edit & del

      캐쉬를 하지 않기 위해서 프로그램 페이지인 경우 프로그램에서 캐쉬를 남기지 않도록 헤더를 삽입하는 방법이 있습니다.

      이미지인 경우 Expires 를 사용하여 강제로 캐쉬가 되지 않도록 지정할 수 있습니다.

      Expires 를 특정 이미지에만 처리하기 위해서는 FilesMatch 나 Location 또는 Directory 등 웹서버의 여러 방식을 이용해 특정 이미지에 대해서만 Expires 처리를 할 수 있습니다.

      또는 특정 폴더 하위에 .htaccess 파일을 생성하여 Expires 를 지정할 수 있습니다.

2009.04.09 15:01

아파치 모듈 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 항목만 조금 수정한 것이다.

Trackback 0 Comment 1
  1. mod_deflate 2009.05.13 11:55 address edit & del reply

    http://httpd.apache.org/docs/2.2/mod/mod_deflate.html