Навіщо стискати відповіді в Nginx
Стиснення відповідей сервера — найдешевший спосіб пришвидшити сайт. Nginx уміє стискати HTML, CSS та JS «на льоту» за допомогою gzip або ефективнішого алгоритму Brotli. Обидва методи зменшують обсяг трафіку у 3–5 разів для текстових файлів, а браузер розпаковує їх майже миттєво.
Різниця між gzip та Brotli — у ступені стиснення та навантаженні на процесор. Brotli стискає щільніше: економія ще 15–20 % трафіку понад gzip, — але потребує окремого модуля, якого немає у стандартній збірці Nginx.
Як увімкнути gzip у Nginx
Модуль gzip вбудований у Nginx за замовчуванням, тому додатково встановлювати нічого не треба. Додайте блок у файл /etc/nginx/nginx.conf всередині секції http {}:
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
gzip_vary on;
gzip_proxied any;Після правки перевірте синтаксис командою nginx -t і перечитайте конфігурацію: systemctl reload nginx.
Параметри gzip: що за що відповідає
| Параметр | Значення | Призначення |
|---|---|---|
| gzip_comp_level | 1–9 | Рівень стиснення: вище — менший розмір, більше навантаження на CPU |
| gzip_min_length | байти | Не стискати файли менші за вказаний розмір |
| gzip_types | список MIME | Які типи файлів стискати |
| gzip_vary | on/off | Додає заголовок Vary: Accept-Encoding для кешів |
Рівень 5–6 — розумний баланс: вище 6 економія мінімальна, а навантаження на процесор помітно зростає.
Як підключити Brotli у Nginx
Стандартна збірка Nginx із репозиторію Ubuntu не містить модуль Brotli. Найпростіше поставити пакет libnginx-mod-http-brotli з репозиторію Nginx або зібрати модуль із вихідного коду разом із --add-module=ngx_brotli.
apt install libnginx-mod-http-brotliПотім підключіть модулі та налаштуйте стиснення в nginx.conf:
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml;Що стискати не варто
Повторне стиснення вже стиснутих форматів безглузде й витрачає процесорний час даремно. Виключіть зі списків gzip_types і brotli_types такі формати:
- зображення JPEG, PNG, WebP — вони вже стиснуті всередині формату
- відео та аудіо: MP4, WebM, MP3
- архіви: ZIP, GZ, 7Z
- шрифти WOFF2 — вже використовують вбудоване стиснення Brotli
Як перевірити, що стиснення працює
Надішліть запит із заголовком Accept-Encoding і подивіться на відповідь сервера:
curl -H "Accept-Encoding: gzip, br" -I https://example.com/У відповіді має з'явитися заголовок Content-Encoding: gzip або Content-Encoding: br. Якщо його немає — перевірте, чи вказаний тип MIME запитаного файлу в gzip_types або brotli_types, а розмір файлу більший за gzip_min_length.
Підсумок
Чек-лист для впровадження стиснення:
- увімкнути gzip на рівні 5–6 для всіх текстових типів MIME
- поставити модуль Brotli і увімкнути його поряд із gzip
- не стискати вже стиснуті формати — зображення, відео, архіви
- перевірити заголовок Content-Encoding через curl після кожної зміни конфігурації
Після базового налаштування стиснення варто налаштувати кешування відповідей через proxy_cache і перевірити підтримку HTTP/2 та HTTP/3 — разом ці три механізми дають основний приріст швидкості віддачі статики.
Часті питання
Чи дає підвищення gzip_comp_level вище базового рівня помітний виграш?
Практично ні — після розумного базового рівня ступінь стиснення майже не росте, а навантаження на процесор зростає помітно сильніше, ніж економія трафіку. Тому для більшості сайтів достатньо середнього значення: різниця в підсумковому розмірі файлу порівняно з максимальним рівнем зазвичай виявляється незначною, а процесор при цьому лишається менш завантаженим.
Чому вже стиснуті файли, скажімо зображення, не варто віддавати через gzip або Brotli?
Формати на зразок JPEG, PNG чи WebP вже використовують власне стиснення всередині самого файлу, тому повторне стиснення gzip або Brotli майже не зменшує розмір, а іноді навіть трохи збільшує його через службові заголовки алгоритму. При цьому сервер все одно витрачає процесорний час на спробу стиснути такий файл, що просто сповільнює відповідь без жодної користі.
Що краще — gzip чи Brotli, і чи варто увімкнути обидва одразу?
Brotli стискає щільніше та економить більше трафіку, ніж gzip, але підтримується не всіма старими клієнтами і потребує окремого модуля. Увімкнути варто обидва: Nginx сам обирає відповідний варіант залежно від заголовка Accept-Encoding браузера, віддаючи Brotli там, де клієнт його підтримує, і переходячи на gzip для решти випадків.
Чому заголовок Content-Encoding іноді відсутній навіть після увімкнення стиснення?
Найчастіше причина в тому, що MIME-тип запитаного файлу не входить до списку gzip_types або brotli_types, або розмір файлу менший за порог gzip_min_length, встановлений у конфігурації. Також заголовок зникне, якщо конфігурацію не перечитали після правки — у такому разі достатньо перевірити синтаксис і перезапустити Nginx командою reload.