Я использую кеш обратного прокси-сервера nginx с включенным gzip. Однако у меня возникли проблемы с HTTP-запросами приложений Android к моему веб-сервису Rails JSON. Когда я выключаю кеш обратного прокси, он работает нормально, потому что заголовок ответа идет без 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;
Я тестировал это в 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)
Я не уверен, насколько это представительно, но это должно служить примером. Кроме того, я не принимал во внимание использование ЦП, но из этих результатов кажется, что идеальный уровень сжатия находится между 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;
}
Это позволяет получить наилучшее сжатие без ущерба для ЦП при каждом запросе.
Уровень сжатия gzip просто определяет степень сжатия данных по шкале от 1 до 9, где 9 - самый сжатый. Компромисс заключается в том, что наиболее сжатые данные обычно требуют большей работы для сжатия / распаковки, поэтому, если вы установили достаточно высокий уровень на веб-сайте с большим объемом, вы можете почувствовать его эффект.
Похоже, ваши проблемы больше связаны с заголовками HTTP в запросах. Обычно HTTP-трафик, сжатый с помощью gzip, сопровождается Content-Encoding: gzip
заголовок. Если это где-то сбрасывается, то клиент может не знать, что нужно распаковывать ответ.
Если вы действительно можете сэкономить ресурсы ЦП, вы можете использовать 9, но для большинства сайтов достаточно 2, поскольку gzip не сильно уменьшает файл после уровня 1.
Редактировать: Я посмотрел на Amazon CloudFront, и похоже, что он использует уровень 6, вероятно, потому, что именно на этом уровне распаковка выполняется быстрее, что улучшает производительность рендеринга страниц.
Если у вас есть веб-сайт большого объема, и вы все же хотели бы иметь полный уровень (9) сжатия, лучшей идеей было бы разместить статический контент на Amazon S3 или аналогичных службах хранения объектов и загрузить сжатые файлы.
Вы все равно захотите использовать nginx для сжатия вашего HTML, поэтому лучше оставить это значение нормальным, я использую там 5.