Gginを有効にしてnginxリバースプロキシキャッシュを使用しています。ただし、AndroidアプリケーションHTTP-requests to my Rails JSON Web service。)からいくつかの問題が発生しました。リバースプロキシキャッシュをオフにすると、問題なく動作するようです応答ヘッダーには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;
Gzip圧縮のレベルは、データが1〜9のスケールでどの程度圧縮されているかを単純に決定します。9が最も圧縮されています。トレードオフは、通常、最も圧縮されたデータは圧縮/圧縮解除に最も多くの作業を必要とするため、大量のWebサイトでかなり高く設定すると、その効果を感じる場合があります。
問題はリクエストのHTTPヘッダーに関連しているようです。通常、gzip圧縮されたHTTPトラフィックにはContent-Encoding: gzip
ヘッダー。これがどこかにドロップされている場合、クライアントは応答を解凍する必要があることを知らない可能性があります。
2つのファイルを使用して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使用率は考慮していませんが、これらの結果から、理想的な圧縮レベルは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を犠牲にすることなく、可能な限り最高の圧縮を得ることができます。
CPUリソースを本当に節約できる場合は9を使用できますが、ほとんどのサイトでは2の値で十分です。これは、gzipがレベル1以降のファイルを大幅に削減しないためです。
編集: Amazon CloudFrontを調べたところ、レベル6を使用しているようです。おそらく、そのレベルが解凍をより高速に実行し、ページのレンダリングパフォーマンスを向上させるためです。
大量のWebサイトがあり、フルレベル(9)の圧縮が必要な場合は、Amazon S3または同様のオブジェクトストレージサービスに静的コンテンツを配置し、圧縮ファイルをアップロードすることをお勧めします。
それでもnginxを使用してHTMLを圧縮する必要があるので、その値を通常に保つには、5を使用します。