Nginx: сжатие gzip для текстовых файлов
Настройка gzip в Nginx: уровни сжатия, типы файлов, проверка. Оптимизация производительности и размера трафика.
Как использовать
- Добавьте настройки gzip в http блок nginx.conf
- Используйте gzip_comp_level 6 для баланса CPU/сжатие
- Проверьте работу: `curl -H 'Accept-Encoding: gzip' -I`
Настройка gzip-сжатия в Nginx для уменьшения размера передаваемых данных. Улучшает скорость загрузки сайта и снижает расход трафика.
Базовая настройка gzip
http {
# Включаем gzip
gzip on;
# Добавляем заголовок Vary: Accept-Encoding
gzip_vary on;
# Сжимать проксированные ответы
gzip_proxied any;
# Уровень сжатия (1-9, 6 оптимально)
gzip_comp_level 6;
# Минимальный размер для сжатия (байты)
gzip_min_length 1000;
# Типы файлов для сжатия
gzip_types text/plain text/css text/xml text/javascript
application/json application/javascript application/xml+rss
application/rss+xml font/truetype font/opentype
application/vnd.ms-fontobject image/svg+xml;
server {
listen 80;
server_name example.com;
# ...
}
}
Оптимизированная конфигурация
http {
gzip on;
gzip_vary on;
gzip_proxied any;
# Баланс между CPU и сжатием
gzip_comp_level 6;
# Не сжимать файлы меньше 1KB
gzip_min_length 1000;
# Буфер для сжатия
gzip_buffers 16 8k;
# Минимальная версия HTTP для сжатия
gzip_http_version 1.1;
# Отключаем для старых браузеров
gzip_disable "msie6";
# Типы файлов
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/rss+xml
application/xml
image/svg+xml
font/truetype
font/opentype
application/vnd.ms-fontobject;
server {
listen 80;
server_name example.com;
# ...
}
}
Gzip для проксированных ответов
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header Accept-Encoding "gzip";
# Сжатие ответов от backend
gzip on;
gzip_types application/json application/javascript text/plain;
}
}
Проверка работы gzip
# Проверка заголовка Content-Encoding
curl -H "Accept-Encoding: gzip" -I http://example.com/style.css
# Должен быть заголовок: Content-Encoding: gzip
# Проверка размера до и после
curl -H "Accept-Encoding: identity" -s http://example.com/app.js | wc -c
curl -H "Accept-Encoding: gzip" -s http://example.com/app.js | wc -c
# Подробная информация
curl -H "Accept-Encoding: gzip" -v http://example.com/style.css 2>&1 | grep Content-Encoding
Отключение gzip для конкретных файлов
server {
listen 80;
server_name example.com;
gzip on;
gzip_types text/css application/javascript;
# Отключаем gzip для изображений (они уже сжаты)
location ~* \.(jpg|jpeg|png|gif|ico|webp|avif)$ {
gzip off;
expires 1y;
}
# Отключаем для уже сжатых файлов
location ~* \.(gz|zip|rar|7z|bz2)$ {
gzip off;
}
}
Уровни сжатия: сравнение
| Уровень | Скорость | Сжатие | CPU | Рекомендация |
|---|---|---|---|---|
| 1 | Очень быстро | Минимальное | Низкое | Не рекомендуется |
| 3-4 | Быстро | Хорошее | Среднее | Для high-load |
| 6 | Средне | Отличное | Среднее | Оптимально |
| 9 | Медленно | Максимальное | Высокое | Только для статики |
Типичные ошибки
- ❌ Сжатие уже сжатых файлов — JPEG, PNG, GIF, WebP уже сжаты
- ❌ Слишком высокий уровень —
gzip_comp_level 9нагружает CPU без пользы - ❌ Сжатие мелких файлов —
< 1000 байтне стоит сжимать - ❌ Нет gzip_vary — кэш не понимает, какая версия отдана
- ❌ gzip_proxied off — ответы от backend не сжимаются
Best practices
- ✅ gzip_comp_level 6 — баланс между размером и CPU
- ✅ gzip_min_length 1000 — не сжимать файлы меньше 1KB
- ✅ gzip_vary on — кэш понимает разницу между сжатой/несжатой версией
- ✅ gzip_proxied any — сжимать ответы от backend
- ✅ Проверка в production — curl с
-H "Accept-Encoding: gzip"
Где применять
- Production: оптимизированная конфигурация с level 6
- High-load: level 3-4 для снижения CPU нагрузки
- Static sites: level 9 для максимального сжатия статики
- API: gzip для JSON ответов > 1KB
Связанные сниппеты:
Документация: