Навіщо стискати відповіді в 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 — разом ці три механізми дають основний приріст швидкості віддачі статики.