력을 버퍼링하는 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"); 와 상관없이 모든 페이지에서 작동합니다.
쓰고 보니 두서가 없군요.
참고가 되시기를 바랍니다.
apache 1.x에서 mod_gzip만 사용해도 압축할 수 있습니다. 설정파일에서 mod_gzip_item_include mime ^application/x-httpd-php만 지정하면 모든 php 파일이 압축되어 전달됩니다. 물론 다른 유형의 파일도 지정할 수 있습니다.
//--> | 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/ 에서 확인하시면됩니다. |
//--> | 저 mime 이라는것이 헤더로 판단하는 것인가 보네요. ^text/html 로 해 보세요. php 의 출력은 아파치의 제어를 벗어날 수 없습니다. |
//--> |
그리고 오래된 Netscape 에서 처리하지 못하기 때문에 그것을 걸러주는 설정도 있는데, 저는 그 오래된 Netscape 자체를 거부하고 싶어서 안넣었습니다. |
form 데이타는 압축할수 없나요... ajax로 xml를 주고 받는데 이 데이타가 더 크네요.. |
//--> | 브라우저에서 압축해서 쏘는건 안될것 같네요. ajax 가 받는건 압축해도 되고요. |
Apache 2.2.X에서는 잘 동작하는데 1.3.XX는 에러가 생기네요. 근데 이미 php 자체의 압축기능을 이용하고 있는데 이중압축하는 셈인데 상관없을까요? 테스트를 해보고 싶은데 얼른 방법이 안떠오르네요....쩝쩝 |
//--> | php 에서 압축을 안해야죠. |
//--> | 이 방법은 환경설정만으로 가능하여 편리하긴 하나 실시간 압축이니깐 좀 .... PHP에서 압축한다면 캐싱 개념으로 미리 압축해놓고 사용하면 되니까 매번 압축할 필요없이 처리하게 할 수도 있겠죠. --------------=----------------- 근데 위 셋팅을 .htaccess에다가 할 수도 있는 건가요? 압축을 지원할 디렉토리를 별도로 지정할 수 있으면 좋을텐데... |
//--> | 미리 압축해 놓고 사용할 수 있는 페이지가 얼마나될까 생각해보고 삽질 안하기로 했습니다. -- 될겁니다. |
//--> | 왜 미리 압축을 생각했느냐 하면 브라우저측 캐싱 기능이야기를 보고 생각난 것인데... 디자인 즉 레이아웃을 담당하는 역할은 HTML로 하고 그 레이아웃에 데이타들을 출력하는 것은 XML이나 데이타값들로 초기화된 Js 배열로 해보려고 합니다. 그리고 이 XML이나 JS배열은 브라우저측 캐싱을 이용하게 하고 싶고요. 그렇다면 이들 데이타를 담은 파일들은 DB의 내용이 갱신되기 전에는 내용이 고정적이니깐 압축상태로 캐싱이 되면 좋겠고, 또한 종종 DB내용의 갱신에 의해 이들 데이타 파일들도 바뀔 테니까 그때마다 압축을 해두고 싶거든요. 욧점은 가끔씩 바뀌긴 바뀌는 파일이고, 바뀌는 싯점이 명확해서 갱신처리도 확실하므로 기왕에 갱신할 때 압축처리도 해버리면 어떨까 하는 겁니다. (그냥 실시간 압축 쪽으로 먼저 테스트 해봐야겠습니다.) 삽질 중입니다.^^;;; |
//--> | js, css 등을 deflate 룰에서 빼고, rewrite 로 php 로 보내면 압축캐싱을 구현할 수 있겠지요. 정적인 html 은 .html 로 해서 rewrite 로 php 에 보내게 하여 일반 php 와 구분하면 될겁니다. |
application/x-javascript 하고 text/javascript 는 무슨 차이가 있을까요? 서버에서 자동으로 헤더에 보내는 값일 경우는 어느값을 보낼까요? text/javascript 요건 자주 봐왔기 떄문에 거의 표준으로 여겨졌는데 application/x-javascript 요걸 보니 혼란스럽네요 ------=----------- 효진님이 최근 자주 보이시니깐 게시판이 훤해져 보입니다. 그래서 하루에도 몇번씩 기웃거리게 됩니다. |
//--> | 네 아파치 자동이 app~~ 입니다. -- *^^* |
이 글은 스프링노트에서 작성되었습니다.
'Computer > LINUX' 카테고리의 다른 글
트래픽 제한 (bandwidth) (0) | 2012.08.10 |
---|---|
웹 DOS 공격 막기 (0) | 2012.08.10 |
아파치 보안 (0) | 2012.08.10 |
아파치 로그 자동백업 (0) | 2012.08.10 |
아파치 로그 (0) | 2012.08.10 |