Quais proxies reversos suportam cabeçalhos HTTP / 1.1 ETag e If-None-Match?

8

Estou desenvolvendo um sistema de armazenamento em cache para uma plataforma de comércio eletrônico que usará um proxy reverso para armazenamento em cache. Planejo lidar com a invalidação usando cabeçalhos HTTP / 1.1 adequados. Ou seja, definirei um ETag na primeira geração do conteúdo e no cache que esse valor ETag no aplicativo. O cabeçalho de controle de cache especificará "deve-revalidar" para que o proxy defina o cabeçalho If-None-Match em solicitações subsequentes com o ETag. O aplicativo pesquisará o valor ETag em cache e, se corresponder, enviará uma resposta 304, caso contrário, gerará uma resposta completa de 200.

Eu esperava usar o nginx, mas não sei ao certo se ele suporta ETags (os documentos indicam que não, mas talvez estejam desatualizados?). O verniz é outra opção, mas também não sou positivo.

Quais servidores proxy reversos por aí têm suporte completo para ETags? Eu gostaria que ele armazenasse em cache várias versões para que eu possa fazer coisas como testes divididos sem precisar desativar o cache. Ou seja, o HTTP / 1.1 especifica que um cliente pode enviar If-None-Match com vários valores ETag e o servidor deve responder com qual ETag correspondeu (se houver). Se o proxy reverso mantivesse várias cópias, e não apenas o último valor visto, e deixasse o servidor especificar em cada solicitação qual usar, isso seria o ideal.

ColinM
fonte

Respostas:

2

Eu verifiquei apenas no código-fonte Varnish e mesmo que apoiar If-Modified-Sincee If-None-Matchcabeçalhos, ele não suporta must-revalidateno Cache-Control. Os únicos atributos suportados em Cache-Controlsão max-agee s-max-age.

Referências:

Jérôme R
fonte
Obrigado. Não sei muito sobre o Varnish VCL, mas é possível especificar o uso do VCL para revalidar sempre, já que o Varnish parece oferecer suporte à revalidação?
ColinM 15/03
Acabei de descobrir que o ramo "experimental-ims" do Varnish parece adicionar suporte completo ao If-None-Match. Esperemos que, eventualmente, seja mesclado em um lançamento estável. varnish-cache.org/trac/wiki/BackendConditionalRequests
Colin
2

O nginx requer módulos de terceiros para oferecer suporte ao ETag. E há dois deles.

Michael Hampton
fonte
O módulo estático etags é para gerar etags, não para armazenar em cache o conteúdo com etags. Da mesma forma, o módulo etags dinâmico gera etags para conteúdo dinâmico para uso upstream, não para uso de proxy reverso. No entanto, penso apoio oficial nginx 1.3 adicionado para etags com proxies reversos ..
ColinM
1
Apenas para referência futura, o nginx suporta ETag e If-None-Match a partir da 1.7.3, mas ainda pode armazenar em cache apenas um resultado para um determinado URL, então eu não chamaria esse suporte completo. Ou seja, você não pode ter várias respostas armazenadas em cache e negociadas com o servidor durante a revalidação. Veja trac.nginx.org/nginx/ticket/101
ColinM
1

Corrija-me se estiver errado e sei que este é um post antigo - mas gostaria de comentar sobre novos transeuntes. Eu acredito que um cache de proxy reverso não ajuda tanto quanto você gostaria ao usar ETags.

Os mecanismos de armazenamento em cache de validação usam o servidor de origem para validar se a ETag (ou data da última modificação) na solicitação ainda é válida (corresponde ou não ao etag de recursos, dependendo do cabeçalho usado ou se foi / não foi modificado desde a data indicada no pedido).

Isso significa que um cache de proxy reverso, como o Varnish, ainda passará essa solicitação para o servidor de origem. Pode responder com a solicitação em vez de o servidor lidar com isso, mas você não salvou a viagem de ida e volta no servidor de origem.

Os navegadores podem armazenar em cache respostas e manipular uma resposta 304 em qualquer caso, portanto, o cache privado do usuário pode ser mais adequado para lidar com isso do que usar um proxy reverso (YMMV, especialmente em escala e dependendo do seu caso de uso, é claro. deseja fazer suposições sobre seus aplicativos).

A partir da especificação 13.3 :

Quando um cache tem uma entrada obsoleta que gostaria de usar como resposta à solicitação de um cliente, primeiro deve verificar com o servidor de origem (ou possivelmente um cache intermediário com uma nova resposta) para ver se sua entrada em cache ainda é utilizável. . Chamamos isso de "validação" da entrada de cache. Como não queremos pagar a sobrecarga de retransmitir a resposta completa se a entrada em cache for boa e não queremos pagar a sobrecarga de uma viagem de ida e volta extra se a entrada em cache for inválida, o protocolo HTTP / 1.1 suporta o uso de métodos condicionais.

e observe 13.3.4 :

Um proxy de cache HTTP / 1.1, ao receber uma solicitação condicional que inclui uma data da última modificação e uma ou mais tags de entidade como validadores de cache, NÃO DEVE retornar uma resposta armazenada em cache localmente ao cliente, a menos que essa resposta em cache seja consistente com todos os campos de cabeçalho condicional na solicitação.

Portanto, o Varnish pode retornar uma resposta para você, mas você ainda tem uma viagem de ida e volta ao servidor. Se você pode usar um cache de aplicativo como APC ou memcache, isso ainda pode valer a pena para você. O cache de validação geralmente é melhor para economia de largura de banda do que para economia de recursos do servidor.

É melhor deixar o cache de validação para o cliente (navegador ou código da API).

O uso do modelo Expiration para armazenamento em cache é onde um cache de proxy reverso realmente brilha. Isso permite que você pule completamente o servidor de origem. Usando Expires, Cache-Control, Date, etc, é a melhor (mais uma vez, IMO) mecanismo para um cache de proxy reverso como o cache pode retornar a resposta, assumindo a sua não obsoleto, sem nunca bater o servidor de origem.

fideloper
fonte
O caso de uso que eu tinha em mente para essa pergunta é ter o proxy revalidado com o servidor de origem e o servidor de origem retornará 304 se o ETag corresponder ao ETag que seria armazenado em cache para um determinado registro. Ou seja, o ETag seria gerado aleatoriamente quando a página for renderizada e salva pela primeira vez com a chave primária desse registro. Se o registro for modificado, o ETag será apagado.
ColinM 26/03
1

Você pode ver o Apache TrafficServer , que parece ter o que você precisa .

thor
fonte
Os documentos são muito escassos nos detalhes de suporte do ETag, mas obrigado por mencionar o TrafficServer!
ColinM