Apache 2.x에서 mod_deflate를 사용하여 파일을 사전 압축하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/75482

문제

나는 아파치를 통해 모든 콘텐츠를 제공하고 있습니다. Content-Encoding: zip 하지만 그것은 즉석에서 압축됩니다.내 콘텐츠의 상당 부분은 디스크에 있는 정적 파일입니다.파일이 요청될 때마다 압축하는 대신 미리 gzip으로 파일을 압축하고 싶습니다.

이것은 제가 믿는 바입니다. mod_gzip Apache 1.x에서는 자동으로 수행되었지만 옆에 .gz가 있는 파일만 있으면 됩니다.더 이상 그렇지 않습니다. mod_deflate.

도움이 되었습니까?

해결책

어쨌든 이 기능은 mod_gzip에서 잘못 배치되었습니다.아파치 2.x에서는 콘텐츠 협상을 통해 그렇게 하세요.구체적으로 활성화해야 합니다. MultiViews 와 더불어 Options 지령 인코딩 유형을 지정해야 합니다. AddEncoding 지령.

다른 팁

내 구성에서 누락된 정말 간단한 줄로 내 질문에 답하려면 다음과 같이 하세요.

Options FollowSymLinks MultiViews

MultiViews 옵션이 누락되었습니다.Ubuntu 기본 웹 서버 구성에 있으므로 나처럼 굴지 말고 그냥 놔두세요.

또한 모든 파일을 압축하는 빠른 Rake 작업을 작성했습니다.

namespace :static do
    desc "Gzip compress the static content so Apache doesn't need to do it on-the-fly."
    task :compress do
        puts "Gzipping js, html and css files."
        Dir.glob("#{RAILS_ROOT}/public/**/*.{js,html,css}") do |file|
            system "gzip -c -9 #{file} > #{file}.gz"
        end
    end
end

MultiView가 예상대로 작동하지 않을 것 같습니다.문서에 따르면 Multiviews는 "서버가 /some/dir/foo에 대한 요청을 받고 /some/dir에 MultiViews가 활성화되어 있고 /some/dir/foo가 존재하지 않는 경우..."라고 말합니다. 즉, 다음과 같습니다.동일한 디렉토리에 foo.js 및 foo.js.gz 파일이 있는 경우 MultiViews를 활성화하면 AcceptEncoding gzip 헤더가 브라우저에 의해 전송되더라도 .gz 파일이 전송되지 않습니다(이 동작은 다음을 통해 확인할 수 있습니다). 일시적으로 mod_deflate를 비활성화하고 예를 들어 응답을 모니터링합니다.HTTPFox).

MultiViews를 사용하여 이 문제를 해결할 수 있는 방법이 있는지 확실하지 않지만(원본 파일의 이름을 바꾼 다음 특수 AddEncoding 지시문을 추가할 수 있음) 이를 처리하기 위해 mod_rewrite 규칙을 구성할 수 있다고 생각합니다.

소스에서 빌드된 Apache 2가 있는데 내 파일에서 다음을 수정해야 한다는 것을 알았습니다. httpd.conf 파일:

옵션에 MultiView 추가:

Options Indexes FollowSymLinks MultiViews

AddEncoding 주석 해제:

AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz

댓글 추가 유형:

#AddType application/x-compress .Z
#AddType application/x-gzip .gz .tgz

다음을 사용하여 사전 압축된 파일을 제공할 수 있습니다. mod_negotiation 조금 까다롭기는 하지만.가장 큰 어려움은 존재하지 않는 파일에 대한 요청만 협상됩니다..그래서 만약 foo.js 그리고 foo.js.gz 둘 다 존재합니다. /foo.js 항상 압축이 해제됩니다(에 대한 응답은 /foo 제대로 작동할 것입니다).

내가 찾은 가장 쉬운 솔루션(프랑수아 마리에에서)은 압축되지 않은 파일의 이름을 이중 파일 확장자로 바꾸는 것입니다. foo.js 다음과 같이 배포됩니다. foo.js.js 그래서 요청합니다 /foo.js 사이에서 협상하다 foo.js.js (인코딩 없음) 및 foo.js.gz (gzip 인코딩).

이 트릭을 다음 구성과 결합합니다.

Options +MultiViews
RemoveType .gz
AddEncoding gzip .gz

# Send .tar.gz without Content-Encoding: gzip
<FilesMatch ".+\.tar\.gz$">
    RemoveEncoding .gz
    # Note:  Can use application/x-gzip for backwards-compatibility
    AddType application/gzip .gz
</FilesMatch>

게시물을 작성했습니다 이 구성에 대한 이유와 몇 가지 대안을 자세히 설명합니다.

mod_gzip 압축 콘텐츠도 즉시 제공됩니다.실제로 서버에 로그인하고 셸에서 수행하여 파일을 미리 압축할 수 있습니다.

cd /var/www/.../data/
for file in *; do
    gzip -c $file > $file.gz;
done;

당신이 사용할 수있는 mod_cache 메모리나 디스크의 로컬 콘텐츠를 프록시합니다.이것이 예상대로 작동하는지 모르겠습니다. mod_deflate.

큰 .json 파일이 많이 있습니다.대부분의 독자들이 이런 상황에 처해 있습니다.미리보기 답변에서는 반환된 "콘텐츠 유형"에 대해 설명하지 않았습니다.

다음 요청에서 "Content-Type:"을 사용하여 사전 압축된 파일을 반환하길 원합니다.application/json"을 투명하게 사용하려면 ForceType과 함께 Multiview를 사용하세요.

http://www.domain.com/(...)/bigfile.json
-> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip

1) 파일 이름을 바꿔야 합니다."파일.ext.ext"

2) Multiview는 ForceType과 잘 작동합니다.

파일 시스템에서:

// Note there is no bigfile.json
(...)/bigfile.json.gz
(...)/bigfile.json.json

아파치 구성에서:

<Directory (...)>
    AddEncoding gzip .gz
    Options +Multiviews
    <Files *.json.gz>
        ForceType application/json
    </Files>
</Directory>

짧고 간단해요 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top