nginx não está usando o gzip para falar com servidores backend

4

Nossos servidores da Web estão executando o IIS 7 e estão configurados para compactar conteúdo dinâmico e estático. Quando eu bato nesses servidores diretamente, a compactação gzip funciona.

Recentemente, coloquei o nginx na frente deles e a compactação gzip parou. Consegui contornar isso ativando explicitamente a compactação gzip no próprio nginx, mas isso parece um pouco ineficiente, considerando que tenho meia dúzia de back-ends e apenas uma caixa nginx ativa.

Parece que o nginx está removendo o cabeçalho Accept-Encoding . Alguém tem algum conselho sobre como "corrigir" esse comportamento?

Uma configuração de amostra:

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;
  }
}
    
por Michael Gorsuch 16.05.2010 / 14:59

3 respostas

2

O Nginx é um proxy reverso HTTP / 1.0, a compactação gzip não estava na especificação HTTP até HTTP / 1.1.

Assim, o nginx não enviará o cabeçalho de codificação de aceitação do gzip porque ele simplesmente não o aceita. A maneira correta de implementar o manuseio do gzip no nginx é conversar com o fastcgi no backend ou fazer o gzip usando o nginx.

    
por 16.05.2010 / 19:07
3

Aparentemente, é possível fazer isso! Por email:

[nginx does do HTTP/1.0], but you can totally do gzip over HTTP 1.0 and we do. The gzip'd content is passed through untouched by nginx, we pre gzip level 9 all our static content, so this is optimal.

nginx can be configured to identify browsers that can do gzip and either foward all the correct headers to the backend and/or do the gzip itself

I think the primary reason nginx doesn't support 1.1 to the backends to because of chunked encoding. (which it does support on the front end) It adds to the complexity of dealing with connections that die mid-stream.

    
por 27.05.2010 / 05:56
3

Não tenho certeza desde há quanto tempo, mas o NGINX agora suporta HTTP / 1.1 para seus back-ends, mas não é um recurso padrão. Você pode ativá-lo configurando proxy_http_version . Muito útil para quando seus servidores de backend estão em vhosts. Por exemplo:

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

Ref: link

    
por 28.10.2015 / 15:08

Tags