nginx + verniz, otimize URLs de cache para ssl e não

1

Eu tenho um cache de verniz funcional para os meus sites, com o efeito colateral indesejado que pedidos de um domínio com http são armazenados em cache com um determinado URL e solicitações de https com outro URL. Dessa forma, acabo com objetos duplos no cache e gostaria de perguntar sobre algumas práticas recomendadas para otimizar esse comportamento.

Em detalhes, tenho dois vhosts dentro do nginx para o mesmo domínio que escuta nas portas 80 e 443 cada. Solicitações são enviadas para o verniz:

proxy_pass http://varnish:8101/VirtualHostBase/http/example.com:80/path/VirtualHostRoot/;

e

proxy_pass http://varnish:8101/VirtualHostBase/https/example.com:443/path/VirtualHostRoot/;

No verniz.vcl, procuro pelo host solicitante e defino o back-end correto, já que existem vários.

if (req.http.host == "example.com") {
  set req.backend = backend_0;
}

O backend é um servidor Zope / Plone. As páginas estão em cache corretamente no verniz, mas eu tenho uma entrada para /VirtualHostBase/http/example.com:80/path/VirtualHostRoot/logo.png e um para /VirtualHostBase/https/example.com:443/path/VirtualHostRoot/logo.png no meu vernizlog (RxURL).

Quando o Plone limpa uma entrada, somente a versão ssl é removida, porque todo usuário logado precisa usar https. A entrada http permanece até a invalidação por idade.

É possível combinar solicitações http e https em um objeto de verniz reescrevendo URLs? Para economizar espaço e fazer uma limpeza bem-sucedida. Talvez alguém possa me dar uma dica de como resolver isso!

    
por boernie 23.09.2014 / 19:40

2 respostas

2

O Varnish identifica diferentes entidades pelo seu req.url e seu req.http.Host (se presente, caso contrário, ele usa server.ip ). O que você quer é isto:

sub vcl_hash {
  #Example URL is:
  # http://varnish:8101/VirtualHostBase/http/example.com:80/path/VirtualHostRoot/
  #req.url contains only:
  # /VirtualHostBase/http/example.com:80/path/VirtualHostRoot/
  #after transform, this will become:
  # /VirtualHostBase/fakescheme/example.com:fakeport/path/VirtualHostRoot/
  hash_data(regsub(regsub(req.url,":(80|443)/",":fakeport/"),"/https?/","/fakescheme/")); #equivalent of "hash URL"

  #Below here, copied from default.vcl
  if (req.http.host) {
    hash_data(req.http.host);
  } else {
    hash_data(server.ip);
  }
  return (hash);
}
    
por 23.09.2014 / 22:08
1

Uma ideia de como você pode implementar isso:

Então você precisa configurar:

  • um proxy reverso Varnish
    • ouvindo na porta *: 80 e usando o host local de backend: 8080
  • um servidor da web Nginx
    • ouvindo na porta *: 443 e encaminhando para o localhost: 80
    • ouvindo no localhost da porta: 8080 e servindo um site

Na verdade, o Nginx já pode ser configurado como um proxy reverso de armazenamento em cache. No entanto, se você quiser ter regras de cache específicas, a capacidade de limpar objetos únicos do cache e assim por diante o Verniz será uma solução melhor.

Dica:

Você precisa verificar se o seu site funciona bem com os mesmos objetos de cache para http e https. Não funciona se o site fornecer HTML, CSS ou JavaScript usando URLs absolutos para conteúdo externo (por exemplo, recursos de mídia incorporados). Como você sabe, os navegadores não gostam de incorporar recursos HTTP em sites HTTPS.

    
por 24.09.2014 / 20:12