gzip в nginx: как включить сжатие стилей и скриптов
В Ubuntu строка gzip on уже включена, но nginx сжимает только страницы HTML. Чтобы сжимались стили, скрипты и JSON, уберите знак # в начале строки gzip_types в файле /etc/nginx/nginx.conf.
Содержание 9
Что сделать прямо сейчас
- Команды вводятся на сервере: подключитесь к нему по SSH ([как подключиться](/instrukcii/kak-podklyuchitsya-k-vps-po-ssh/)) и набирайте их в том же окне.
- Откройте главный файл настроек nginx:
sudo nano /etc/nginx/nginx.conf. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter. - Найдите блок сжатия: Ctrl+W, слово
gzip_types, Enter. Эта строка и несколько строк над ней начинаются со знака # — так они выключены. - Уберите # и пробел в начале строк gzip_vary, gzip_proxied, gzip_comp_level и gzip_types. Поставьте курсор стрелками прямо перед словом gzip и нажмите Backspace два раза — на Mac эта клавиша называется delete.
- Сохраните файл — Ctrl+O, Enter, затем Ctrl+X — и проверьте настройки:
sudo nginx -t. В ответе должны быть слова syntax is ok и test is successful. Тогда примените их:sudo systemctl reload nginx. Если команда ничего не ответила, настройки применены. - Проверьте сжатие — как это сделать.
Если проверка нашла ошибку, nginx назовёт файл и номер строки, а сайт продолжит работать на старых настройках. Что значит сообщение — Все ошибки nginx.
Что сжимается по умолчанию
В файле /etc/nginx/nginx.conf в Ubuntu 24.04 есть блок про сжатие. Включена в нём одна строка — gzip on;. Остальные начинаются со знака # и не действуют. Без строки gzip_types nginx сжимает только ответы с типом text/html, то есть страницы. Стили, скрипты и JSON уходят несжатыми.
После правки блок выглядит так:
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript
text/xml application/xml application/xml+rss text/javascript;Здесь строка gzip_types перенесена, чтобы поместиться на экран. В файле она одна длинная — переносить её не нужно.
| Строка | Что делает | Если её нет |
|---|---|---|
gzip on; | включает сжатие | сжатия нет |
gzip_types …; | какие типы файлов сжимать, кроме HTML | сжимается только HTML |
gzip_vary on; | добавляет к сжатым ответам заголовок Vary: Accept-Encoding: кэширующие серверы между сайтом и посетителем держат сжатую и несжатую копии отдельно | заголовка нет |
gzip_proxied any; | сжимает ответы и на запросы через прокси-сервер — nginx узнаёт их по заголовку Via | такие ответы не сжимаются |
gzip_comp_level 6; | степень сжатия от 1 до 9: выше — файлы меньше, но больше работы процессору | степень 1 |
Значения по умолчанию на этой странице — для nginx 1.24 из Ubuntu 24.04. Версию на сервере покажет nginx -v.
Какие файлы сжимать
Тип файла nginx определяет по расширению — по списку из файла /etc/nginx/mime.types. В gzip_types пишут именно типы, а не расширения.
| Файлы | Тип | Что делать |
|---|---|---|
| .css | text/css | уже в строке Ubuntu |
| .js | application/javascript | уже в строке Ubuntu |
| .json | application/json | уже в строке Ubuntu |
| .txt и .xml | text/plain, text/xml | уже в строке Ubuntu |
| .svg | image/svg+xml | добавьте в конец строки gzip_types, перед точкой с запятой: SVG — текстовый файл |
| .jpg, .png, .webp, .woff2 | image/jpeg, image/png, image/webp, font/woff2 | не добавляйте: эти файлы уже сжаты, повторное сжатие только нагрузит процессор |
Значение gzip_types *; включает сжатие любых типов, в том числе картинок, — его лучше не ставить.
Как проверить, что сжатие работает
Попросите у сайта сжатый ответ и посмотрите заголовки. Вместо example.com — адрес вашего сайта:
curl -sI -H 'Accept-Encoding: gzip' https://example.com/Если сжатие работает, в ответе будет строка Content-Encoding: gzip. curl может показать имена заголовков маленькими буквами — это то же самое. Без части -H 'Accept-Encoding: gzip' nginx ответит без сжатия: так curl сообщает, что не умеет распаковывать. Браузеры просят сжатие сами.
Страницы HTML сжимаются и без gzip_types. Чтобы проверить стили, нужен адрес CSS-файла. Найдите его в коде главной страницы:
curl -s https://example.com/ | grep -o 'href="[^"]*\.css[^"]*"'Команда покажет ссылки на файлы стилей, например href="/css/style.css". Проверьте этот файл той же командой, адрес возьмите в кавычки:
curl -sI -H 'Accept-Encoding: gzip' 'https://example.com/css/style.css'Подробнее о ключах curl — команды wget и curl.
Когда nginx не сжимает ответ
- тип файла не указан в gzip_types — кроме text/html;
- код ответа не 200, не 403 и не 404 — например, 301 или 500;
- в ответе уже есть заголовок Content-Encoding: его поставило приложение, и nginx второй раз не сжимает;
- ответ короче gzip_min_length — по умолчанию 20 байт; длину nginx берёт из заголовка Content-Length;
- браузер или программа не прислали заголовок Accept-Encoding со словом gzip;
- запрос пришёл через прокси-сервер с заголовком Via, а строки gzip_proxied нет;
- запрос по HTTP/1.0: gzip_http_version по умолчанию 1.1.
Где писать gzip
Директивы сжатия можно писать в блоках http, server и location, а gzip — ещё и в if внутри location. В Ubuntu они стоят в блоке http файла nginx.conf и действуют для всех сайтов на сервере.
Чтобы выключить сжатие для одного сайта, напишите в его блоке server строку gzip off;. Своя строка gzip_types в блоке server заменяет список из nginx.conf, а не дополняет его: перечислите в ней все нужные типы.
Не пишите gzip on; второй раз в файле из /etc/nginx/conf.d/: такие файлы подключаются внутрь того же блока http, и проверка sudo nginx -t ответит "gzip" directive is duplicate. Так же с gzip_vary и gzip_comp_level.
Ошибки и как их исправить
| Что видите | Что делать |
|---|---|
| HTML сжимается, стили и скрипты — нет | уберите # в начале строки gzip_types — шаги |
"gzip" directive is duplicate | строка gzip on написана дважды в одном блоке: удалите ту, что в файле из conf.d |
unknown directive "gzip_type" | опечатка в имени: разбор ошибки |
curl без -H 'Accept-Encoding: gzip' не показывает Content-Encoding | так и должно быть: добавьте эту часть в команду |
| браузер пишет ERR_CONTENT_DECODING_FAILED | разбор ошибки |
Источники
- Документация nginx: модуль ngx_http_gzip_module — gzip, gzip_types (text/html сжимается в любом случае), gzip_comp_level от 1 до 9, gzip_min_length 20, gzip_vary, gzip_proxied и заголовок Via, gzip_http_version 1.1.
- Файл nginx.conf из пакета nginx в Ubuntu 24.04 —
worker_processes auto,worker_connections 768,gzip on, журналы в /var/log/nginx/, подключение conf.d и sites-enabled. - Файл mime.types из пакета nginx в Ubuntu 24.04 — css → text/css, js → application/javascript, svg → image/svg+xml, webp → image/webp, woff2 → font/woff2.
- Исходный код nginx 1.24.0: ngx_http_gzip_filter_module.c — сжимаются только ответы с кодом 200, 403 и 404, без своего Content-Encoding, не короче gzip_min_length и с типом из gzip_types.
- Исходный код nginx 1.24.0: ngx_http_core_module.c — функция ngx_http_gzip_ok: без gzip в Accept-Encoding, при версии запроса ниже gzip_http_version и при заголовке Via без разрешения gzip_proxied ответ не сжимается.
- Исходный код nginx 1.24.0: ngx_http.c — функция ngx_http_merge_types: свой список типов в блоке заменяет список внешнего блока.
- Исходный код nginx 1.24.0: ngx_conf_file.c — повторная директива с одним значением в том же блоке — ошибка is duplicate.
Сверено 14 октября 2026 года.
Что почитать дальше
- Настройки nginxкак устроены файлы и блоки, главные директивы.
- expires в nginxкак настроить кэш браузера для стилей и картинок.
- add_header в nginxкак добавить свой заголовок к ответу.
- ERR_CONTENT_DECODING_FAILEDесли браузер не может распаковать ответ.
- Команды wget и curlкак смотреть заголовки ответа командой curl -I.