Який найкращий рівень gzip стиснення nginx?


44

Я використовую nginx зворотний проксі-кеш із включеним gzip. Однак у мене виникли проблеми з додатками Android HTTP-запитами до моєї веб-служби 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;

Відповіді:


18

Рівень стиснення gzip просто визначає, наскільки стислими є дані за шкалою від 1-9, де 9 є найбільш стислими. Компроміс полягає в тому, що для стиснення / декомпресії даних для стиснення / декомпресії зазвичай потрібна найбільше роботи, тому, якщо на веб-сайті з великими обсягами він встановлений досить високо, ви можете відчути його ефект.

Схоже, ваші проблеми більше пов'язані із заголовками HTTP у запитах. Зазвичай HTTP-стислий трафік HTTP супроводжується Content-Encoding: gzipзаголовком. Якщо це десь скидається, клієнт, можливо, не знає, що потрібно декомпресувати відповідь.


Як відключити відповідь gzip за допомогою клієнтського заголовка запиту? Спробую Accept-Encoding: '', але це не працює.
Chamnap

З RFC2616 ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ) Я думаю, що ви хочете просто "Прийняти-кодування:", без нічого наступного.
зросте

Так, я додав заголовок Accept-Encoding з порожньою рядком з рекламним доповненням на mozilla, і відповідь назад без 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)

Я не впевнений, наскільки це репрезентативно, але це повинно слугувати прикладом. Крім того, я не брав до уваги використання процесора, але на основі цих результатів ідеальний рівень стиснення здається між 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;
}

Це дозволяє отримати найкраще можливе стиснення, не жертвуючи процесором на кожен запит.


це джейби з результатами на weblogs.asp.net/owscott/iis-7-compression-good-bad-how-much, які показують великі падіння рівня стиснення після рівня 5 і 6
Джефф Етвуд

6

Якщо ви дійсно можете зекономити ресурси процесора, ви можете використовувати 9, але для більшості сайтів достатньо значення 2, оскільки gzip не значно зменшує файл після рівня 1.

Редагувати: Я переглянув 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у свою конфігурацію, тому не можу сказати, на якому рівні я зараз перебуваю. Чи знаєте ви, що таке за замовчуванням? Джерело?
Хассан Байг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.