Computer/LINUX

압축전송

알찬돌삐 2012. 8. 10. 16:21

력을 버퍼링하는 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");가 들어있지 않은 페이지는 압축이 일어나지 않습니다.

추가  : php.ini에 zlib.output_compression = On
을 추가해주면 모든 페이지가 압축되지만
ob_start("ob_gzhandler");와는 충돌합니다.
따라서 모든 페이지에 압축을 원하는 경우 zlib.output_compression = On 을 사용하고
그렇지 않은 경우에는 원하는 페이지에만 선택적으로 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"); 와 상관없이 모든 페이지에서 작동합니다.

쓰고 보니 두서가 없군요.
참고가 되시기를 바랍니다.

 

 

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

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

        //-->
   카르마   07-12-22 11:23  
mod_gzip_item_include mime ^application/x-httpd-php
를 설정해줘도
ob_start("ob_gzhandler"); 가 없는 페이지는 압축이 안됩니다.
테스트 해보시지요.

테스트는
<?
ob_start();
phpinfo();
ob_end_flush();
?>와
<?
ob_start("ob_gzhandler");
phpinfo();
ob_end_flush();
?>
두개의 화일로  http://www.whatsmyip.org/mod_gzip_test/ 에서 확인하시면됩니다.
mod_gzip_item_include mime ^application/x-httpd-php 를 설정해줘도 ob_start("ob_gzhandler"); 가 없는 페이지는 압축이 안됩니다. 테스트 해보시지요. 테스트는 <? ob_start(); phpinfo(); ob_end_flush(); ?>와 <? ob_start("ob_gzhandler"); phpinfo(); ob_end_flush(); ?> 두개의 화일로 http://www.whatsmyip.org/mod_gzip_test/ 에서 확인하시면됩니다.
             //-->
   송효진   07-12-22 12:54  
저 mime 이라는것이 헤더로 판단하는 것인가 보네요.
^text/html 로 해 보세요.
php 의 출력은 아파치의 제어를 벗어날 수 없습니다.
저 mime 이라는것이 헤더로 판단하는 것인가 보네요. ^text/html 로 해 보세요. php 의 출력은 아파치의 제어를 벗어날 수 없습니다.
                  //-->
   카르마   07-12-22 13:34  
설정화일을 자세히 읽어보니 송효진님 말씀이 맞네요.
mime이라는 것이 HTTP header 'Content-Type'으로 결정하는 것이라서
mod_gzip_item_include        mime      ^text/html$
한줄이면 ^application/x-httpd-php는 필요없고 php든 html이든 다 적용이 되는군요.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

여태껏 php 같은 서버스크립트는 아파치의 영향을 어느정도 벗어났기 때문에,
압축전송은 php 가 맡아야 하는줄 알고 있었습니다......

그런데 Content-Type 으로 php의 출력 조차 아파치가 압축시켜버릴 수 있네요.
링크의 예제는 이미지빼고 몽땅압축 하는것도 있는데,
그러면 php 파일 다운로드 등에도 영향을 미치므로,
Content-Type 으로 몇가지만 압축합시다.

주의할것은 어플과 통신하는 php 가 있다면,
그것에는 영향이 없도록 잘 설정해야 할 것입니다.
어플이 Content-Type 을 안따진다면,
해당 php 가 엉뚱한 Content-Type 을 날려주기만 하면 되겠지요.

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

요것을 vhost 의 개별설정에 추가합니다.

License : Public Domain
  License
이 게시물은 저작자에게 모든 권리가 있습니다.

 

 
   송효진   07-10-18 05:17  
그리고 오래된 Netscape 에서 처리하지 못하기 때문에 그것을 걸러주는 설정도 있는데,
저는 그 오래된 Netscape 자체를 거부하고 싶어서 안넣었습니다.
그리고 오래된 Netscape 에서 처리하지 못하기 때문에 그것을 걸러주는 설정도 있는데, 저는 그 오래된 Netscape 자체를 거부하고 싶어서 안넣었습니다.
 
   RamboZzang   07-10-18 09:18  
form 데이타는 압축할수 없나요... ajax로 xml를 주고 받는데 이 데이타가 더 크네요..
form 데이타는 압축할수 없나요... ajax로 xml를 주고 받는데 이 데이타가 더 크네요..
        //-->
   송효진   07-10-18 10:12  
브라우저에서 압축해서 쏘는건 안될것 같네요.
ajax 가 받는건 압축해도 되고요.
브라우저에서 압축해서 쏘는건 안될것 같네요. ajax 가 받는건 압축해도 되고요.
 

 

   카르마   07-10-18 09:47  
Apache 2.2.X에서는 잘 동작하는데
1.3.XX는 에러가 생기네요.

근데 이미 php 자체의 압축기능을 이용하고 있는데 이중압축하는 셈인데 상관없을까요?
테스트를 해보고 싶은데 얼른 방법이 안떠오르네요....쩝쩝

Apache 2.2.X에서는 잘 동작하는데 1.3.XX는 에러가 생기네요. 근데 이미 php 자체의 압축기능을 이용하고 있는데 이중압축하는 셈인데 상관없을까요? 테스트를 해보고 싶은데 얼른 방법이 안떠오르네요....쩝쩝

        //-->
   송효진   07-10-18 10:12  
php 에서 압축을 안해야죠.
php 에서 압축을 안해야죠.
        //-->
   까칠한고민남   07-10-18 17:52  
이 방법은 환경설정만으로 가능하여 편리하긴 하나
실시간 압축이니깐 좀 ....

PHP에서 압축한다면 캐싱 개념으로 미리 압축해놓고 사용하면 되니까
매번 압축할 필요없이 처리하게 할 수도 있겠죠.

--------------=-----------------

근데 위 셋팅을 .htaccess에다가 할 수도 있는 건가요?
압축을 지원할 디렉토리를 별도로 지정할 수 있으면 좋을텐데...
이 방법은 환경설정만으로 가능하여 편리하긴 하나 실시간 압축이니깐 좀 .... PHP에서 압축한다면 캐싱 개념으로 미리 압축해놓고 사용하면 되니까 매번 압축할 필요없이 처리하게 할 수도 있겠죠. --------------=----------------- 근데 위 셋팅을 .htaccess에다가 할 수도 있는 건가요? 압축을 지원할 디렉토리를 별도로 지정할 수 있으면 좋을텐데...
             //-->
   송효진   07-10-18 18:09  
미리 압축해 놓고 사용할 수 있는 페이지가 얼마나될까 생각해보고
삽질 안하기로 했습니다.
--
될겁니다.
미리 압축해 놓고 사용할 수 있는 페이지가 얼마나될까 생각해보고 삽질 안하기로 했습니다. -- 될겁니다.
                  //-->
   까칠한고민남   07-10-18 18:41  
왜 미리 압축을 생각했느냐 하면 
브라우저측 캐싱 기능이야기를 보고 생각난 것인데...

디자인 즉 레이아웃을 담당하는 역할은 HTML로 하고
그 레이아웃에 데이타들을 출력하는 것은
XML이나 데이타값들로 초기화된 Js 배열로 해보려고 합니다.
그리고 이 XML이나 JS배열은 브라우저측 캐싱을 이용하게 하고 싶고요.

그렇다면 이들 데이타를 담은 파일들은
DB의 내용이 갱신되기 전에는 내용이 고정적이니깐 압축상태로 캐싱이 되면 좋겠고,
또한 종종 DB내용의 갱신에 의해 이들 데이타 파일들도 바뀔 테니까 그때마다
압축을 해두고 싶거든요.

욧점은
가끔씩 바뀌긴 바뀌는 파일이고, 바뀌는 싯점이 명확해서 갱신처리도 확실하므로
기왕에 갱신할 때 압축처리도 해버리면 어떨까 하는 겁니다.
(그냥 실시간 압축 쪽으로 먼저 테스트 해봐야겠습니다.)

삽질 중입니다.^^;;;
왜 미리 압축을 생각했느냐 하면 브라우저측 캐싱 기능이야기를 보고 생각난 것인데... 디자인 즉 레이아웃을 담당하는 역할은 HTML로 하고 그 레이아웃에 데이타들을 출력하는 것은 XML이나 데이타값들로 초기화된 Js 배열로 해보려고 합니다. 그리고 이 XML이나 JS배열은 브라우저측 캐싱을 이용하게 하고 싶고요. 그렇다면 이들 데이타를 담은 파일들은 DB의 내용이 갱신되기 전에는 내용이 고정적이니깐 압축상태로 캐싱이 되면 좋겠고, 또한 종종 DB내용의 갱신에 의해 이들 데이타 파일들도 바뀔 테니까 그때마다 압축을 해두고 싶거든요. 욧점은 가끔씩 바뀌긴 바뀌는 파일이고, 바뀌는 싯점이 명확해서 갱신처리도 확실하므로 기왕에 갱신할 때 압축처리도 해버리면 어떨까 하는 겁니다. (그냥 실시간 압축 쪽으로 먼저 테스트 해봐야겠습니다.) 삽질 중입니다.^^;;;
                       //-->
   송효진   07-10-18 19:01  
js, css 등을 deflate 룰에서 빼고,
rewrite 로 php 로 보내면 압축캐싱을 구현할 수 있겠지요.
정적인 html 은 .html 로 해서 rewrite 로 php 에 보내게 하여
일반 php 와 구분하면 될겁니다.
js, css 등을 deflate 룰에서 빼고, rewrite 로 php 로 보내면 압축캐싱을 구현할 수 있겠지요. 정적인 html 은 .html 로 해서 rewrite 로 php 에 보내게 하여 일반 php 와 구분하면 될겁니다.
 
   까칠한고민남   07-10-18 18:35  
application/x-javascript 하고 text/javascript 는 무슨 차이가 있을까요?
서버에서 자동으로 헤더에 보내는 값일 경우는 어느값을 보낼까요?

text/javascript 요건 자주 봐왔기 떄문에 거의 표준으로 여겨졌는데
application/x-javascript  요걸 보니 혼란스럽네요

------=-----------
효진님이 최근 자주 보이시니깐 게시판이 훤해져 보입니다.
그래서 하루에도 몇번씩 기웃거리게 됩니다.
application/x-javascript 하고 text/javascript 는 무슨 차이가 있을까요? 서버에서 자동으로 헤더에 보내는 값일 경우는 어느값을 보낼까요? text/javascript 요건 자주 봐왔기 떄문에 거의 표준으로 여겨졌는데 application/x-javascript 요걸 보니 혼란스럽네요 ------=----------- 효진님이 최근 자주 보이시니깐 게시판이 훤해져 보입니다. 그래서 하루에도 몇번씩 기웃거리게 됩니다.
        //-->
   송효진   07-10-18 18:55  
네 아파치 자동이 app~~ 입니다.
--
*^^*
네 아파치 자동이 app~~ 입니다. -- *^^*
 
   울라떵   07-10-23 10:22  
Apache 2.0 부터 적용되는 모듈인가봅니다 ㅡㅡa

 

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > LINUX' 카테고리의 다른 글

트래픽 제한 (bandwidth)  (0) 2012.08.10
웹 DOS 공격 막기  (0) 2012.08.10
아파치 보안  (0) 2012.08.10
아파치 로그 자동백업  (0) 2012.08.10
아파치 로그  (0) 2012.08.10