2010-03-08 5 views
4

mod_deflate가 아파치로 컴파일되지 않아서 지금 당장 다시 컴파일하지 않는 것 같아요. 수동 접근 방식의 단점은 무엇입니까? 뭔가 같은 :mod_deflate 대신에 수동으로 대체

AddEncoding x-gzip .gz 
RewriteCond %{HTTP_ACCEPT_ENCODING} gzip 
RewriteRule ^/css/styles.css$ /css/styles.css.gz 

(참고 : 나는한다 RewriteCond의 특성이 약간을 쥐게 될 필요가 있음을 알고 있어요)

+1

파일을 변경할 때마다 gzipped 버전을 생성해야하거나 (1) gzipped 사용자에게 파일의 이전 버전이 제공되도록하거나 (2) 임의로 gzipped 버전이 아직 작성되지 않은 경우 404ing. 단지 실수 하나, 갑자기 Heisenbug를 추적하는 것이 매우 어렵습니다. –

+0

예 - 특정 유스 케이스는 매우 적은 수의 파일을 변경하기위한 것일 뿐이므로이 방법으로는 여전히 단점이 있지만 분명히 막연한 것은 아닙니다. 나는 "RewriteCond % {REQUEST_FILENAME} -f"를 체인에 추가하는 것을 고려해 봤지만, 상수 파일 통계의 비효율에 대한 우려가있다. (나는 아파치 캐시가 어떻게 정보를 캐쉬하는지 모르겠다.) –

답변

3

또 다른 방법은 모든 것을 PHP 스크립트로 전달하는 것입니다. PHP 스크립트는 모든 것을 gzip하고 캐시합니다. 모든 요청에 ​​대해 캐시 된 버전과 타임 스탬프를 비교하여 소스 파일보다 최신 버전 인 경우이를 반환합니다. PHP를 사용하면 HTTP 헤더를 덮어 쓸 수 있으므로 Apache 자체에서 GZIP 처리 된 것처럼 제대로 처리됩니다. 당신을 위해 일을 할 수있는이 같은

뭔가 :

htaccess로

RewriteEngine On 
RewriteRule ^(css/styles.css)$ cache.php?file=$1 [L] 

cache.php : 아파치 캐시 된 버전을 생성하기 위해 당신은 쓰기 권한이 필요합니다

<?php 
// Convert path to a local file path (may need to be tweaked) 
cache($_GET['file']); 

// Return cached or raw file (autodetect) 
function cache($file) 
{ 
    // Regenerate cache if the source file is newer 
    if (!is_file($file.'.gz') or filemtime($file.'.gz') < filemtime($file)) { 
    write_cache($file); 
    } 

    // If the client supports GZIP, send compressed data 
    if (!empty($_SERVER['HTTP_ACCEPT_ENCODING']) and strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) { 
    header('Content-Encoding: gzip'); 
    readfile($file.'.gz'); 
    } else { // Fallback to static file 
    readfile($file); 
    } 
    exit; 
} 

// Saved GZIPed version of the file 
function write_cache($file) 
{ 
    copy($file, 'compress.zlib://'.$file.'.gz'); 
} 

. 스크립트를 약간 수정하여 캐시 된 파일을 다른 위치에 저장할 수 있습니다.

이것은 광범위하게 테스트되지 않았으므로 필요에 따라 약간 수정해야하지만 아이디어는 모두 있어야하며 시작할 수 있도록 충분해야합니다.

+1

큰 음수 기호를 작은 음수 기호로 바꾸기를 원할 것입니다. 그것 이외에, 좋아 보인다. – Alex

+0

고마워요, 당신 말이 맞아요;) –

+0

예, 이전에 언급 한 서버 측 스크립트에 대한 언급은 저 라인을 따라 생각하고있었습니다. 그래도 'compress.zlib : //'을 많이 사용합니다. 나는 전에 그것을 보지 못했습니다. –

1

하면 사이에 큰 성능 차이가있을 것 같지 않습니다 수동 및 자동 접근. 나는 자동 및 수동 압축으로 아파치 벤치를 실행했으며 두 시간은 서로 4 % 이내였다.

분명한 단점은 배포하기 전에 수동으로 CSS 파일을 압축해야한다는 것입니다. 당신이 확실하게하고 싶은 또 다른 사항은 구성이 올바르다는 것입니다. 나는 수동 접근법을 시도했을 때 CSS를 자동 디코딩하는 wget을 얻을 수 없었으며 ab 리포트는 자동 압축과 같이 압축되지 않은 것 대신 압축 된 데이터 크기를 나열했다.

+0

수동 압축은 그다지 문제가되지는 않습니다.이 경우, 거의 변경되지 않는 파일을 다루고 있습니다. 압축은 서버 측 스크립트를 통해 자동화 될 수 있습니다. wget의 정보는 매우 유용합니다. 연구에 감사드립니다. 나는 실제로 그것을 사용하려고한다면 이것을 테스트해야 할 것 같지만, 성능 차이에 대한 훌륭한 정보 - 많은 감사합니다. –

1

mod_ext_filter을 사용하고 gzip을 통해 파이프로 연결할 수도 있습니다. 사실, 예제 중 하나입니다 :

 
# mod_ext_filter directive to define the external filter 
ExtFilterDefine gzip mode=output cmd=/bin/gzip 

<Location /gzipped> 
# core directive to cause the gzip filter to be 
# run on output 
SetOutputFilter gzip 

# mod_header directive to add 
# "Content-Encoding: gzip" header field 
Header set Content-Encoding gzip 
</Location> 

이의 장점은 정말, 정말 쉬운 것입니다 ... 단점은 분명히 작은이되는 각 요청에 추가 fork()exec()가있을 것입니다 성능에 미치는 영향.