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

nginx не использует gzip для связи с внутренними серверами

Наши веб-серверы работают под управлением IIS 7 и настроены на сжатие динамического и статического содержимого. Когда я напрямую попадаю на эти серверы, сжатие gzip работает.

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

Похоже, что nginx удаляет Accept-Encoding заголовок. Есть ли у кого-нибудь совет, как «исправить» такое поведение?

Пример конфигурации:

upstream backend {
  server 127.0.0.1:8080;
}

server {
  listen   80;
  proxy_set_header        Host            $host;
  proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

  location / {
    proxy_pass http://backend;
  }
}

Судя по всему, это возможно! По электронной почте:

[nginx поддерживает HTTP / 1.0], но вы можете полностью использовать gzip поверх HTTP 1.0, и мы это делаем. Содержимое gzip'd проходит через nginx нетронутым, мы предварительно gzip уровня 9 все наше статическое содержимое, так что это оптимально.

nginx может быть настроен для идентификации браузеров, которые могут использовать gzip, и либо направлять все правильные заголовки на бэкэнд, либо выполнять сам gzip

Я думаю, что основная причина, по которой nginx не поддерживает 1.1 для бэкэндов, из-за фрагментированного кодирования. (который он поддерживает на внешнем интерфейсе). Это добавляет сложности работе с соединениями, которые умирают в середине потока.

Я не уверен, сколько времени, но NGINX теперь поддерживает HTTP / 1.1 для своих бэкэндов, это просто не стандартная функция. Вы можете включить его, установив proxy_http_version. Очень полезно, когда ваши внутренние серверы находятся на vhosts. Например:

location / {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_pass http://my-backend-vhost.example.com/;
  proxy_http_version 1.1;
}

Ссылка: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version

Nginx - это обратный прокси HTTP / 1.0, сжатие gzip не входило в спецификацию HTTP до HTTP / 1.1.

Таким образом, nginx не будет отправлять заголовок accept-encoding gzip, потому что он просто не принимает его. Правильный способ реализовать обработку gzip в nginx - либо передать fastcgi бэкэнду, либо использовать gzip с помощью nginx.