Назад | Перейти на главную страницу

Как лучше всего сжать бэкэнд в данные обратного прокси nginx?

Мы собираемся запустить обратный прокси-сервер nginx, который будет извлекать данные из серверной части через Интернет.

Под Интернетом мы подразумеваем, что серверная машина не будет находиться в локальной сети с фронтальным обратным прокси-сервером.

Мы подумали, что было бы неплохо обработать эти запросы до их отправки через Интернет.

На мой взгляд, это должно работать примерно так:

Клиент запрашивает контент с заголовком accept-encoding или gzip.

Обратный прокси отправляет это на внутренний сервер.

Серверная часть сжимает это содержимое, так как был отправлен заголовок accept encoding gzip.

Запрос отправлен по всей цепочке в сжатом виде.

Мы все можем это сделать, потому что это довольно просто. У меня вопрос: как это будет работать, если на стороне обратного прокси-сервера nginx включено сжатие gzip?

Будет ли nginx пытаться сжать уже сжатый контент?

Надеюсь, это имеет смысл. Спасибо.

ОБНОВЛЕНИЕ 1:

Я понимаю последствия кеширования уже (и этого обслуживающего) сжатого содержимого. Мы бы изменили ключ кеширования, чтобы включить заголовок кодировки accept, и, таким образом, обслуживать (и кэшировать) правильно сжатый / несжатый контент в соответствии с тем, что может принять пользовательский агент.

Нет, нет проблем с установкой gzip на обратном прокси и внутреннем сервере. По крайней мере, у меня никогда не было проблем. Прокси-сервер распознает уже сжатый контент и просто доставит его.

Если вы хотите, чтобы какой-либо контент был сжат с бэкэнда, просто добавьте соответствующий заголовок.

proxy_set_header Accept-Encoding "gzip";
  1. http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_http_version - версия HTTP-запроса, необходимая для gzip для сжатия ответов на сервере, по умолчанию - 1.1.

  2. http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version - версия HTTP-запроса, используемая по умолчанию прокси-модулем, - 1.0

Это означает, что по умолчанию запрос GET 1.1 вашего браузера преобразуется в запрос GET 1.0, когда прокси запрашивает его с серверной части. Серверной части требуется 1.1 для выполнения сжатия gzip, поэтому ответ не сжимается.

Мое предложение - использовать proxy_http_version 1.1; на обратном прокси, а стандартный gzip on; и т.д. настройки на внутреннем сервере.

Есть две дополнительные вещи, чтобы оптимизировать это. Один из них - установка gzip_static (дополнительный модуль). Когда делается запрос к index.html, этот параметр ищет и доставляет файл index.html.gz, если он существует. Это положительно сказывается на использовании ЦП, поскольку сжатие не выполняется на лету.

Что касается другой части вашего вопроса, то, что на самом деле сжимается, устанавливается с помощью параметра gzip_types. По умолчанию сжимается только text / html. Если у вас есть файлы gzip, вы должны быть осторожны, чтобы исключить их. Если вы используете * вариант (сжать все), тогда также сжатые файлы будут сжаты с помощью gzip перед отправкой. Это не оптимально для большинства изображений (jpg, png, gif), поскольку в них уже реализован какой-то слой сжатия LZW. Таким образом, сжатие сжатого файла приводит лишь к небольшому уменьшению или даже увеличению размера, при этом для выполнения сжатия используются значительные ресурсы ЦП. Вы должны внимательно изучить, что вы хотите сжать, в зависимости от частоты запросов и типа запрашиваемого контента (или степени сжатия). Что касается изображений, их оптимизация с помощью дополнительных инструментов (optipng и т. Д.) Более эффективна, чем включение сжатия gzip.