最高のnginx圧縮gzipレベルは何ですか?


44

gzipを有効にしてnginxリバースプロキシキャッシュを使用しています。しかし、AndroidアプリケーションのHTTPリクエストからRails JSON Webサービスへの問題がいくつかありました。リバースプロキシキャッシュをオフにすると、応答ヘッダーに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が最も圧縮されます。トレードオフは、最も圧縮されたデータは通常、圧縮/解凍に最も多くの作業を必要とするため、大量のWebサイトでかなり高く設定されている場合、その効果を感じることがあります。

問題はリクエストのHTTPヘッダーにより関連しているようです。通常、gzip圧縮されたHTTPトラフィックにはContent-Encoding: gzipヘッダーが付随します。これがどこかにドロップされている場合、クライアントは応答を解凍する必要があることを知らない可能性があります。


クライアントからのhttpリクエストヘッダーを使用してgzip応答を無効にする方法 Accept-Encoding: ''を試しますが、機能しません。
Chamnap

RFC2616(w3.org/Protocols/rfc2616/rfc2616-sec14.html)から、「Accept-Encoding:」だけが必要だと思います。
8

ええ、mozillaのポスターアドオンで空の文字列を使用してAccept-Encodingヘッダーを追加し、Content-Encodingなしで応答を返します: 'gzip'。ただし、Androidアプリでは、常にgzipで返されます。プロキシキャッシュディレクトリにキャッシュされているものをチェックしました。nginxはgzipコンテンツをキャッシュするため、おそらくgzipに返される応答です。これを解決するには?
Chamnap

一部の情報源は、圧縮レベルが増加しても圧縮解除リソースは増加しないことを示唆しています。実際に、圧縮レベルが上がるとリソースが減少する場合があります。stackoverflow.com/questions/28452429/…–
user2208096

90

これをnginx 1.3.9で2つのファイルでテストしましたが、これらはさまざまなレベルで得られた結果です。


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使用率を考慮していませんが、これらの結果から理想的な圧縮レベルは〜の間4にあるよう6です。


さらに、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-muchレベル5の後と6の圧縮レベルに大きな低下を披露
ジェフ・アトウッド

6

CPUリソースを本当に節約できる場合は、9を使用できますが、ほとんどのサイトでは2の値で十分です。レベル1の後、gzipはファイルをあまり削減しないからです。

編集: Amazon CloudFrontを調べたところ、レベル6を使用しているようです。おそらく、そのレベルが解凍をより高速に実行し、ページレンダリングのパフォーマンスが向上しているためです。


これは正しくありません
-calumbrodie

2
クラウドはそれについて何が悪いのか説明しますか?とにかく、私は答えを更新し、もう少し調査しました。AmazonCloudFrontのようなサイトは圧縮レベル6を使用していることがわかりました。
DiegoG

1)2と6の違いは些細なことではありません。10〜15%までデータを確認するか、自分で試してください。2)圧縮のレベルは、解凍の難しさに影響しません(stackoverflow.com/questions/28452429/…を参照)
calumbrodie

0

大量のウェブサイトがあり、それでもフルレベル(9)の圧縮を希望する場合、最良のアイデアは静的コンテンツをAmazon S3または同様のオブジェクトストレージサービスに配置し、圧縮ファイルをアップロードすることです。

あなたはまだあなたのHTMLを圧縮するためにnginxを使用したいので、その値を通常に保つ方が良いでしょう、私はそこで5を使用します。


私はあなたの提案を使いたいと思いますが、私は現在comp_level私の設定にa を含めていませんので、現在どのレベルにいるのかわかりません。デフォルトが何であるか知っていますか?ソース?
ハッサンBaig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.