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