최고의 nginx 압축 gzip 수준은 무엇입니까?


44

gzip을 활성화 한 상태에서 nginx 리버스 프록시 캐시를 사용하고 있습니다. 그러나 Android 애플리케이션에서 Rails JSON 웹 서비스에 대한 HTTP 요청에 문제가 있습니다. 리버스 프록시 캐시를 끄면 응답 헤더에 gzip이 없으므로 제대로 작동합니다. 따라서 문제는 gzip으로 인한 것 같습니다. 가장 적합한 gzip 압축 수준은 무엇입니까?

gzip               on;
gzip_http_version  1.0;
gzip_vary          on;
gzip_comp_level    6;
gzip_proxied       any;
gzip_types         text/plain text/css text/javascript application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss;

답변:


18

gzip 압축 수준은 단순히 데이터가 1-9에서 압축되는 정도를 결정합니다. 여기서 9가 가장 압축됩니다. 단점은 압축 된 데이터가 많을수록 압축 / 압축 해제하는 데 가장 많은 작업이 필요하다는 것입니다. 따라서 대량의 웹 사이트에서 데이터를 상당히 높게 설정하면 그 효과를 느낄 수 있습니다.

문제가 요청의 HTTP 헤더와 더 관련이있는 것 같습니다. 일반적으로 gzip 압축 HTTP 트래픽에는 Content-Encoding: gzip헤더 가 동반됩니다 . 이것이 어딘가에 떨어지면 클라이언트는 응답을 압축 해제 할 필요가 없습니다.


클라이언트의 http 요청 헤더를 사용하여 gzip 응답을 비활성화하는 방법은 무엇입니까? Accept-Encoding : ''을 시도했지만 작동하지 않습니다.
Chamnap

RFC2616 ( w3.org/Protocols/rfc2616/rfc2616-sec14.html )에서 나는 아무것도 따르지 않고 'Accept-Encoding :'을 원한다고 생각합니다.
11

예, mozilla에 poster addon이있는 빈 문자열로 Accept-Encoding 헤더를 추가하고 Content-Encoding이없는 응답은 'gzip'입니다. 그러나 Android 앱에서는 항상 gzip으로 돌아갑니다. 프록시 캐시 디렉토리에 캐시 된 것을 확인하고 nginx는 gzip 내용을 캐시하므로 아마도 gzip으로 응답합니다. 이것을 해결하는 방법?
Chamnap

일부 출처에서는 압축 수준이 높아질수록 압축 해제 리소스가 증가하지 않는다고 제안합니다. 압축 수준이 증가함에 따라 리소스가 실제로 감소 하는 경우도 있습니다. stackoverflow.com/questions/28452429/…
user2208096

90

나는 이것을 두 개의 파일로 nginx 1.3.9에서 테스트했으며 다음은 다양한 수준에서 얻은 결과입니다.


text/html -phpinfo () :

0    55.38 KiB (100.00% of original size)
1    11.22 KiB ( 20.26% of original size)
2    10.89 KiB ( 19.66% of original size)
3    10.60 KiB ( 19.14% of original size)
4    10.17 KiB ( 18.36% of original size)
5     9.79 KiB ( 17.68% of original size)
6     9.62 KiB ( 17.37% of original size)
7     9.50 KiB ( 17.15% of original size)
8     9.45 KiB ( 17.06% of original size)
9     9.44 KiB ( 17.05% of original size)

application/x-javascript -jQuery 1.8.3 (비 압축) :

0    261.46 KiB (100.00% of original size)
1     95.01 KiB ( 36.34% of original size)
2     90.60 KiB ( 34.65% of original size)
3     87.16 KiB ( 33.36% of original size)
4     81.89 KiB ( 31.32% of original size)
5     79.33 KiB ( 30.34% of original size)
6     78.04 KiB ( 29.85% of original size)
7     77.85 KiB ( 29.78% of original size)
8     77.74 KiB ( 29.73% of original size)
9     77.75 KiB ( 29.74% of original size)

이것이 얼마나 대표적인지 잘 모르겠지만 예제로 사용되어야합니다. 또한, 나는 계정으로 CPU 사용량을 촬영하지 않은 그러나이 결과에서 이상적인 압축 수준은 사이가 될 것으로 보인다 46.


또한 gzip_static모듈 을 사용하는 경우 파일을 사전 압축 할 수 있습니다 (PHP).

function gzip_static($path)
{
    if ((extension_loaded('zlib') === true) && (is_file($path) === true))
    {
        $levels = array();
        $content = file_get_contents($path);

        foreach (range(1, 9) as $level)
        {
            $levels[$level] = strlen(gzencode($content, $level));
        }

        if ((count($levels = array_filter($levels)) > 0) && (min($levels) < strlen($content)))
        {
            if (file_put_contents($path . '.gz', gzencode($content, array_search(min($levels), $levels)), LOCK_EX) !== false)
            {
                return touch($path . '.gz', filemtime($path), fileatime($path));
            }
        }
    }

    return false;
}

따라서 모든 요청에서 CPU를 희생하지 않고도 최상의 압축을 얻을 수 있습니다.


이 지브는 weblogs.asp.net/owscott/iis-7-compression-good-bad-how-uch 에서 결과를 얻었으며, 레벨 5와 6 이후 압축 수준이 크게 떨어졌습니다.
Jeff Atwood

6

실제로 CPU 리소스를 절약 할 수 있으면 9를 사용할 수 있지만 gzip은 레벨 1 이후에 파일을 크게 줄이지 않기 때문에 대부분의 사이트에는 2의 값이면 충분합니다.

편집 : Amazon CloudFront를 살펴본 결과 레벨 6을 사용하고있는 것 같습니다. 아마도 해당 레벨이 압축 풀기를 더 빠르게 실행하여 페이지 렌더링 성능을 향상시키는 레벨 일 것입니다.


이것은 정확하지 않습니다
calumbrodie

2
클라우드 당신은 그것에 대해 무엇이 잘못 설명합니까? 어쨌든, 나는 대답을 업데이트하고 조금 더 연구했으며 Amazon CloudFront와 같은 사이트는 압축 수준이 6이기 때문에 압축 속도가 가장 좋기 때문에 아마도 페이지가 더 빨리로드됩니다.
DiegoG

1) 2와 6의 차이는 사소한 것이 아니며 최대 10-15 %, 데이터를 보거나 직접 시도해보십시오. 2) 압축 수준은 압축 해제에 영향을 미치지 않습니다 ( stackoverflow.com/questions/28452429/… 참조 )
calumbrodie

0

대량의 웹 사이트가 있고 여전히 전체 수준 (9)의 압축을 원하는 경우 정적 콘텐츠를 Amazon S3 또는 유사한 객체 스토리지 서비스에 배치하고 압축 파일을 업로드하는 것이 가장 좋습니다.

여전히 nginx를 사용하여 HTML을 압축하고 싶습니다. 그래서 그 값을 정상으로 유지하는 것이 좋습니다 .5를 사용합니다.


귀하의 제안을 사용하고 싶지만 현재 comp_level구성에 포함하지 않았 으므로 현재 어느 수준인지 알 수 없습니다. 기본값이 무엇인지 아십니까? 출처?
Hassan Baig
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.