Nginx Reverse Proxy Gzip para o cliente

7

Eu tenho um servidor web IIS 6.0 exposto à Internet que não está executando o Gzipping de forma confiável. Eu sei que é velho, mas é tudo o que tenho para trabalhar neste momento.

O que eu quero fazer é colocar o Nginx (ou similar) na frente do IIS como um proxy reverso e servidor de cache para acelerar o site. No entanto, não tenho certeza se é possível ter o servidor nginx gzip de si mesmo para o navegador da web. Se o IIS passar as solicitações Gzipped de volta para o nginx, elas voltarão ao navegador bem.

gzip                on;
gzip_min_length     1000;
gzip_buffers        4 8k;
gzip_http_version   1.0;
gzip_disable        "msie6";
gzip_types          text/plain text/css;
gzip_vary           on;

location / {
    proxy_set_header x-real-IP $remote_addr;
    proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    proxy_set_header host $host;
    proxy_pass http://192.168.5.37;
}

Solicitação HTTP (/css/components.css)

GET /css/components.css HTTP/1.1
Host: www.mydomain.co.uk
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/css,*/*;q=0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6

Resposta HTTP (/css/components.css)

HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 22 Oct 2015 14:26:08 GMT
Content-Type: text/css
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Last-Modified: Sat, 22 Aug 2015 09:36:54 GMT
ETag: W/"07f8614bedcd01:8beb"
X-Powered-By: ASP.NET

Existe um parâmetro mágico que eu estou perdendo em algum lugar para dizer para comprimir os arquivos no nginx?

Obrigado!

Dean

    
por Dean Thomas 22.10.2015 / 16:28

2 respostas

9

Você pode adicionar a diretiva gzip_proxied any; ao seu conf.

edit:

Meu teste:
Eu configurei um servidor HTTP simples (não capaz de gzip por conta própria) na minha máquina (192.168.122.1) com python -m http.server 8080 . Quando eu peço eu recebo:

[pat@morbier ~]$ curl -I -H 'Accept-Encoding: gzip,deflate' http://192.168.122.1:8080/
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.5.0
Date: Thu, 22 Oct 2015 17:41:39 GMT
Content-type: text/html; charset=utf-8
Content-Length: 1197

Eu configurei um proxy com nginx (192.168.122.224)

gzip_min_length     1000;
gzip_buffers        4 8k;
gzip_http_version   1.0;
gzip_disable        "msie6";
gzip_types          text/plain text/css;
gzip_vary           on;

location / {
    proxy_set_header x-real-IP $remote_addr;
    proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    proxy_set_header host $host;
    proxy_pass http://192.168.122.1:8080;
}

Quando eu solicito a mesma coisa com o proxy, obtenho

[pat@morbier ~]$ curl -I -H 'Accept-Encoding: gzip,deflate http://192.168.122.224/
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 22 Oct 2015 17:46:08 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 1197
Connection: keep-alive

Então eu adiciono ao proxy conf

gzip on;
gzip_proxied any;

E eu recebo

[pat@morbier ~]$ curl -I -H 'Accept-Encoding: gzip,deflate' http://192.168.122.224/
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 22 Oct 2015 17:47:54 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Content-Encoding: gzip

Você também pode vê-lo se você enrolar sem -I (obtendo assim toda a página), no meu caso, ele se transforma em algum binário exibido no terminal, reforçando o fato de que ele está comprimido. Quando eu enrolo o site regular que não está gzip eu recebo o conteúdo da página da web (HTML).

edit2:
Na verdade, funciona apenas com as opções ativadas, parece que não é necessário ter o gzip_proxied.
Ah, você está solicitando sem passar o cabeçalho 'Accept-Encoding: gzip, deflate' (eu acho que você está usando o telnet). Não funcionará nesse caso porque você não diz ao servidor que pode processar binário codificado por gzip.
Tente com onda por favor.

    
por 22.10.2015 / 17:24
0

Sim, isso com certeza pode ser feito. Descobri inadvertidamente (no meu caso, o iis 8.5, que estava gzipando perfeitamente até que eu coloquei o proxy reverso nginx na frente dele, e o gzip da perspectiva do navegador foi perdido).

A configuração mostrada aqui:

nginx: o gzip no servidor é perdido durante o proxy

Dará aos seus clientes interação gzip com o nginx, independentemente do que ele faça.

Ajuste os tipos de mime a gosto.

    
por 23.10.2015 / 18:30