Descrição do problema
O servidor de origem de um nome de domínio acelerado pelo Alibaba Cloud CDNDCDN é um servidor NGINX com o recurso de compactação Gzip ativado. A compactação Gzip funciona normalmente quando um cliente solicita um recurso diretamente ao servidor de origem. No entanto, ela não entra em vigor se o cliente for redirecionado de um ponto de presença (POP) para o servidor de origem. Veja os detalhes abaixo:
Quando a compactação e a descompactação Gzip funcionam conforme o esperado, o servidor NGINX retorna o conteúdo compactado para reduzir o overhead de tráfego e acelerar a resposta. Contudo, após o uso do Alibaba Cloud CDNDCDN, as solicitações são redirecionadas dos POPs para o servidor de origem e os clientes recebem o conteúdo descompactado. Nesse cenário, o recurso de compactação Gzip no servidor de origem não surte efeito. Confira mais detalhes a seguir:
Sem o uso do Alibaba Cloud CDNDCDN, se os cabeçalhos da solicitação contiverem Accept-Encoding: gzip, deflate, o cabeçalho de resposta correspondente será Content-Encoding: gzip. Nesse caso, o conteúdo é compactado.
Com o uso do Alibaba Cloud CDNDCDN, mesmo que os cabeçalhos da solicitação contenham Accept-Encoding: gzip, deflate, o cabeçalho de resposta retornado será Content-Length, sem o retorno do cabeçalho Content-Encoding: gzip.
Causa
A configuração relacionada ao Gzip no servidor de origem NGINX está inválida, impedindo a ativação da compactação Gzip para solicitações redirecionadas ao servidor de origem. Entenda melhor o motivo:
O cabeçalho Via é adicionado à solicitação sempre que ela é redirecionada de um POP para o servidor de origem, indicando que provém de um proxy. Neste exemplo, o Alibaba Cloud CDNDCDN atua como esse proxy. Entretanto, o módulo ngx_http_gzip_module do NGINX possui o item de configuração gzip_proxied, responsável por controlar a ativação da compactação Gzip em solicitações via proxy. A presença do cabeçalho Via nos cabeçalhos da solicitação é um dos pré-requisitos para que essa configuração funcione. Portanto, o parâmetro gzip_proxied determina se a compactação Gzip será aplicada às solicitações de origem.
Solução
Caso enfrente o mesmo problema descrito na seção Descrição do problema, siga as etapas abaixo para atualizar o arquivo de configuração do NGINX. Se não conseguir identificar o problema, consulte a seção Referências.
Localize os blocos relacionados ao Gzip nos arquivos de configuração do NGINX. É possível configurar o Gzip nos blocos http, server e location, que correspondem a diferentes arquivos de configuração. Neste exemplo, o Gzip está configurado no bloco http do arquivo nginx.conf.
-
Verifique se o item de configuração gzip_proxied existe. Caso exista, modifique-o conforme a configuração a seguir. Se não existir, adicione a configuração abaixo. Para mais informações sobre o item gzip_proxied, consulte a documentação do NGINX.
NotaSe o item de configuração gzip_proxied não existir, o valor padrão da configuração abaixo será off.
gzip_proxied anyNotaO valor any indica que a compactação Gzip está ativada para todas as solicitações via proxy.
-
Após salvar a configuração anterior, execute os comandos abaixo em sequência para confirmar as configurações do NGINX e recarregar seus arquivos de configuração.
nginx -t nginx -s reload Ative o Alibaba Cloud CDNDCDN. Depois que as solicitações forem redirecionadas ao servidor de origem NGINX, verifique se a resposta contém o cabeçalho Content-Encoding: gzip. Em caso afirmativo, o conteúdo está compactado.
Referências
Siga as etapas abaixo para verificar se você enfrenta o mesmo problema descrito na seção Problema:
Abra uma interface de linha de comando (CLI) compatível com o comando curl.
-
Execute o seguinte comando curl para acessar o servidor de origem incluindo o cabeçalho Accept-Encoding: gzip, deflate.
curl -voa 'http://[$Domain]/[$Resource]' -x [$Original_Server_IP]:80 -H 'Accept-Encoding: gzip, deflate'Nota[$Domain]: seu nome de domínio.
[$Resource]: a URL de um recurso solicitado, como uma imagem ou uma operação de API.
[$Original_Server_IP]: o endereço IP público do servidor de origem NGINX.
O sistema retorna uma resposta semelhante ao conteúdo abaixo. Verifique se o cabeçalho Content-Encoding: gzip foi retornado.

-
Use o comando a seguir como base e adicione um cabeçalho Via ao comando da Etapa 2 para simular uma solicitação proveniente de um proxy.
curl -voa 'http://[$Domain]/[$Resource]' -x [$Original_Server_IP]:80 -H 'Accept-Encoding: gzip, deflate' -H 'Via:xxx'NotaÉ possível usar qualquer valor para o cabeçalho Via, pois isso não afeta o resultado do teste. Neste exemplo, utilizamos xxx.
O sistema retorna uma resposta semelhante ao conteúdo abaixo. Verifique se o cabeçalho retornado é Content-Length em vez de Content-Encoding: gzip.
