NGINX
#nginx#gzip#compression#performance#optimization#http

Nginx: сжатие gzip для текстовых файлов

Настройка gzip в Nginx: уровни сжатия, типы файлов, проверка. Оптимизация производительности и размера трафика.

Как использовать

  1. Добавьте настройки gzip в http блок nginx.conf
  2. Используйте gzip_comp_level 6 для баланса CPU/сжатие
  3. Проверьте работу: `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

Связанные сниппеты:

Документация: