nginx reverse proxy: Como passar pelo cabeçalho “accept-encoding” para servidores back-end

4

Usando o nginx na frente do IIS 8.5.

O IIS 8.5 tem compressão configurada e funcionando muito bem.

Mas quando chegamos ao nginx (config abaixo), o gzip é perdido (da perspectiva do navegador da web).

Parte 1: A tentativa nº 1 da solução era ativar o gzip no nginx, o que trouxe de volta o gzip da perspectiva do navegador, mas agora (tememos) ou (a) sobrecarregou o gzip duplo (gzip) no iis, descompacte no nginx, gzip novamente no nginx); ou, (b) o gzip está agora no nginx, o que não é ideal (porque temos um controle melhor sobre o iis, e podemos tomar melhores decisões sobre o que é estático e o que é dinâmico e, portanto, melhor cache, etc.). A configuração da solução # 1 pode ser vista aqui: nginx: o gzip no servidor é perdido durante o proxy

Addendum 1: Per nginx docs (https://www.nginx.com/resources/admin-guide/compression-and-decompression/): " NGINX ... does not “double compress” responses that are already compressed"

This is good, in that double-zipping will not occur.

Parte 2: Então, o que realmente queremos é que o cabeçalho de codificação aceita passe por , do navegador até o nginx até o iis, vamos fazer toda a compactação, e passar as respostas gzipadas através do nginx sem nenhuma sobrecarga gzip acontecendo no nginx. Nossa configuração atual está abaixo.

A pergunta: Como alcançamos a parte 2 no nginx 1.7.9?

Execução da configuração do proxy reverso, que remove todo o gzip (por exemplo, parece retirar o cabeçalho da codificação de aceitação):

http {

upstream sandbox_site {
    least_conn;
    # we pipe to back end on port 80 only, so that nginx handles all ssl
    server 192.168.2.16:80 max_fails=1 fail_timeout=60s;  # sbox3-site is .2.16
}

server {
    # This is sandbox.myapp.com block **************************************
    listen 192.168.2.27:80;
    server_name sandbox.myapp.com;

    location / {
    proxy_pass http://sandbox_site;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    # This is SSL version of sandbox.myapp.com block **************************************
    listen 192.168.2.27:443 ssl;
    server_name sandbox.myapp.com;

    ssl_certificate      new-sandbox-myapp-com.cer;
    ssl_certificate_key  new-sandbox-myapp-com.key;

    ssl_protocols SSLv3 TLSv1;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://sandbox_site;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;            
    }
} 
    
por samsmith 23.10.2015 / 18:38

1 resposta

1

Com certeza o iniciador do tópico já encontrou a resposta, mas vou postá-los para outros públicos.

A primeira solução (habilitando o gzip no próprio nginx) não resultará em compactação duplicada. O Nginx é inteligente o suficiente para ver que o upstream já fez compressão e não tentou a compactação duas vezes.

A solução da parte 2 perdeu apenas um bit na configuração do proxy, ou seja:

proxy_http_version 1.1;

Com esse bit adicionado, tudo funcionará como esperado (o nginx fornecerá conteúdo gzipado do upstream)

    
por 11.07.2018 / 20:39

Tags