Как предотвратить повторное сжатие nginx обратным прокси-сервером сжатого ответа восходящего потока?

#nginx #nginx-reverse-proxy #ngx-brotli

#nginx #nginx-reverse-proxy #ngx-brotli

Вопрос:

У меня есть обратный прокси-сервер nginx, который получает сжатый ответ brotli от восходящего потока (кэш Varnish). Но обратный прокси-сервер подает сжатый ответ brotli браузеру, только если я настрою «brotli on;» в блоке обратного прокси-сервера.

Моя цель — чтобы обратный прокси-сервер nginx вообще не обрабатывал сжатие. Для достижения этой цели у меня есть следующие вопросы:

  1. Ожидается ли, что блок обратного прокси-сервера не будет сжимать полученный ответ и обрабатывать его самостоятельно? Разве он не может напрямую передать ответ восходящего потока обратно клиенту?

  2. Есть ли способ сбросить ответ прокси или его размер в журналы nginx? Это поможет лучше отладить проблему.

Комментарии:

1. Здесь снято в темноте, но можно ли это исправить простым gzip off; способом в вашей конфигурации nginx?

2. Пробовал gzip off; и все еще вижу проблему. Кроме того, я могу воспроизвести точно такое же поведение с помощью gzip (нигде нет brotli). Это означает, что я вижу несжатый ответ в браузере, даже если восходящий поток возвращает сжатый ответ, но gzip отключен на обратном прокси-сервере nginx.

Ответ №1:

Я решил эту проблему, поэтому публикую это для всех, кто может столкнуться с подобной проблемой:

  1. Varnish изменил заголовок моего запроса ‘Accept-Encoding’ на ‘gzip’. Согласно документации Varnish, это так, как задумано (см. Здесь ).
  2. Однако вышестоящий сервер nginx (за varnish) ответил несжатым содержимым, потому что значение по умолчанию gzip_http_version равно 1.0, а значение по умолчанию proxy_http_version равно 1.1 . (см. Здесь )

Разрешение было достигнуто путем:

a. настройка Varnish, чтобы не беспокоиться о сжатии, перейдя -p http_gzip_support=off к varnishd .

б. установка gzip_http_version значения 1.1 на восходящем сервере Nginx.

Расшифровка вышеупомянутого поведения стала возможной, потому что я зарегистрировал следующее на своем восходящем сервере nginx (тот, который стоит за varnish):

 log_format bytes_sent '$bytes_sent' - '$http_accept_encoding' - '$request';