nginx обратный прокси для распределения CloudFront с сохранением сжатия gzip

Вопрос или проблема

У меня проблемы с настройкой обратного прокси nginx, который сохраняет сжатие gzip.

Моя настройка:

  • У меня есть дистрибуция Cloudfront с включенным сжатием gzip (как вы можете увидеть на http://dvty1uxa5ftxq.cloudfront.net, мой main.js действительно сжат, что уменшает его размер более чем на 1/3).

  • Поскольку некоторые страницы перенаправлены на другой веб-сайт, на URL моего основного сайта я фактически перенаправляю запросы через прокси nginx, соответствующая часть конфигурации выглядит следующим образом:

    server {
        listen 443 ssl;
        ...
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        location @cloudfront {
            proxy_set_header Host $http_host;
            proxy_pass http://dvty1uxa5ftxq.cloudfront.net;
        }
    

Похоже, этого недостаточно для сохранения сжатия gzip, когда браузер запрашивает ресурсы сайта с правильными заголовками accept, указывающими на gzip. Я недостаточно разбираюсь в nginx, чтобы понять, нужно ли мне включить модуль gzip или сделать что-то еще. Большинство документации, которую я могу найти, объясняет, как активировать шифрование gzip (например, для локальных файлов), но не когда уже существует надежное шифрование gzip, выполняемое проксируемой конечной точкой (в данном случае CloudFront).

Может кто-то помочь прояснить ситуацию?

Согласно моему пониманию, вы должны включить gzip и сообщить nginx, что можно отправлять сжатые ответы, даже если они проксируются.

location / {
  ...
  gzip            on;
  gzip_proxied    any;
  ...
}

Смотрите https://nginx.org/en/docs/http/ngx_http_gzip_module.htm для получения дополнительной документации.

Если вы хотите включить декомпрессию для клиентов, которые не поддерживают gzip, посмотрите на gunzip.

location / {
  ...
  gunzip          on;
  ...
}

Ответ или решение

Чтобы обеспечить правильную работу обратного прокси-сервера Nginx с CloudFront и сохранить gzip-сжатие, необходимо внести некоторые изменения в вашу конфигурацию Nginx. Ваш текущий конфигурационный файл в целом выглядит хорошо, но важно активировать gzip-сжатие в Nginx и правильно настроить сервер.

Вот шаги, которые нужно сделать:

  1. Включите модуль gzip: Nginx должен быть настроен так, чтобы обрабатывать сжатие. Включите gzip в вашем конфигурационном файле и настройте его для проксируемых запросов:
http {
    ...

    gzip on;  # Включаем gzip
    gzip_proxied any;  # Разрешаем сжатие для всех проксируемых запросов
    gzip_types application/javascript text/css application/json application/xml;  # Задаем типы файлов для сжатия
    gzip_vary on;  # Устанавливаем заголовок Vary для указания поддержки сжатия в ответах
    gzip_min_length 1000;  # Минимальная длина ответа для сжатия
    gzip_disable "msie6";  # Отключаем gzip для Internet Explorer 6

    ...
}
  1. Настройте блок сервера: Внутри блока server, убедитесь, что заголовок Host устанавливается фильтром на хост CloudFront, и не забудьте добавить следующие настройки:
server {
    listen 443 ssl;
    ...

    location @cloudfront {
        proxy_set_header Host dvty1uxa5ftxq.cloudfront.net;  # Устанавливаем заголовок Host
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://dvty1uxa5ftxq.cloudfront.net;
        proxy_set_header Accept-Encoding "";  # Отключаем сжатие на уровне прокси
    }

    # Основной маршрут запроса
    location / {
        try_files $uri @cloudfront;  # Если файл не найден, проксируем его
    }

    ...
}
  1. Добавление поддержки для gunzip (по желанию): Если вы хотите, чтобы Nginx обрабатывал и распаковывал gzip-сжатые ответы для клиентов, которые не поддерживают gzip, вы можете использовать следующий код:
    location / {
        gunzip on;  # Включаем распаковку gzip-ответов
        try_files $uri @cloudfront;  # Проксируем на CloudFront, если файл не найден
    }
  1. Проверка настроек: После внесения изменений проверьте конфигурацию на наличие ошибок:
nginx -t
  1. Перезагрузка Nginx: Если тест прошел успешно, перезагрузите Nginx для применения изменений:
sudo systemctl reload nginx

Теперь ваша конфигурация Nginx должна корректно обрабатывать gzip-сжатие для ресурсов, проксируемых через CloudFront, что обеспечит быструю загрузку ваших веб-страниц для конечных пользователей. Убедитесь, что вы проверяете заголовки ответов в инструменте разработчика вашего браузера, чтобы удостовериться, что сжатие работает, и заголовок Content-Encoding: gzip присутствует в ответах.

Оцените материал
Добавить комментарий

Капча загружается...