Uns meses atrás, fiz um post no meu blog sobre como fazer cache no Youtube. Apesar de funcionar, a solução não era eficaz. Isso porque o Youtube possui um sistema de balanceamento de banda, enviando-nos cada vez para um subdomínio diferente. A solução fazia o cache do recurso; no entanto, dificilmente utilizava-o.
Pesquisando na Internet, encontrei a resposta para o problema. A solução é um recurso dentro do próprio squid. Seu objetivo é criar uma equivalência entre URLs diferentes. Para tanto, chama um programa externo (um helper), que deve ser criado por nós.
Veja seu squid.conf. Lá, vai encontrar comentada a linha storeurl_rewrite_program. Este recurso chama o helper externo que faz uma reescrita de URL. Você pode dizer: "Ah, mas url_rewriter eu ja conheço e não serve". Só que este não é o url_rewriter "normal". A diferença entre ambos é que o resultado do storeurl_rewrite só é utilizado no momento de gravar a URL e comparar o resultado.
Vou dar um exemplo para você entender melhor. Considere as seguintes requisições que pedem o mesmo arquivo em 3 servidores espelhados:
http://img1.orkut.com/imagem1.jpg [1]
http://img2.orkut.com/imagem1.jpg [2]
http://img3.orkut.com/imagem1.jpg [3]
Temos um script externo chamado pelo storeurl_rewrite que traduz a regex "img[0-9].orkut.com" para "imgokt.INTERNO". Se na entrada do helper forem inseridas as strings [1], [2] ou [3], o resultado será:
http://imgokt.INTERNO/imagem1.jpg [4]
Se o helper for colocado no url_rewrite "normal" vai dar um erro, porque o domínio imgokt.INTERNO não existe. Se você colocar em storeurl_rewrite, o squid vai solicitar [1] ao servidor original e gravar como [4]. No momento em que [2] for requisitado, ele irá transformar a requisição em [4] e verificar que já está no cache. Logo, vai dar HIT ao invés de solicitar de novo. O mesmo para [3]. Transforma, compara e retorna o equivalente. Entendeu?
Para usar o recurso, você vai precisar montar na mão um script para fazer a tradução das URL. Eu criei um em PHP para fazer o tratamento da URL do Youtube. O passo inicial foi feito através das regras do thundercache v2.2. Mas analisando o access.log, vi que era necessária uma atualização nas regras. O helper vai em anexo. É interessante também aplicar as regras explicadas no meu outro post para fazer a gravação.
No caso do Youtube, extraímos de uma URL gigante o ID e a qualidade do vídeo. A URL final (para propósitos de equivalência) fica mais ou menos assim:
http://flv.youtube.inComum/?id=abcdefghjklmnopqrstuvwxyz&fmt=34
Então, sempre que o vídeo com o mesmo id e a mesma qualidade for pedido, o squid entregará o conteúdo do cache. Faça o teste com dois navegadores diferentes. Atenção: o recurso (arquivo) de vídeo do Youtube costuma expirar rapidamente. Você também vai precisar de uma regra para fazê-lo durar mais. A instalação completa está descrita no arquivo instalar.txt, em anexo.
O script faz equivalência de url dos vídeos do Youtube, do imgX.orkut.com, staticX.orkut.com e Avast.
Além do código em si, é bom entender algumas particularidades do squid. A maior delas é a de que nem toda instalação é igual. Algumas versões podem ser (muito) diferentes. Em algumas, o script pode simplesmente esgotar a memória do seu servidor por causa de uma falha do próprio squid. Você deve ler o leiame.txt antes de colocar em produção.
Para testar o script "offline", ou seja, somente para verificar a tradução das URLs, simplesmente transforme-o em executável e rode-o no console, digitando as URLs de teste.
Projeto
Hoje, infelizmente, quem encontra algumas respostas para boas soluções em cache, transforma seus projetos em software proprietário. Eu gostaria muito de seguir o caminho inverso e começar um projeto para manter um script livre e gratuito. Para isso, preciso de almas bondosas para colaborar com ele, incluindo opções para outros domínios e me mandando logs do squid e outros feedbaks. Se alguém quiser portar para python ou outra linguagem de script (ou mesmo C), é bem-vindo. Se você concorda, poste um comentário. Se tiver gente suficiente interessada, começamos o projeto.
UPDATE: O programa virou projeto. Está hospedado no SourceForge. Se você trabalha com Squid, pode também se inscrever na lista de discussão.
Comentários recentes
há 6 weeks 2 days atrás
há 11 weeks 1 dia atrás
há 15 weeks 1 dia atrás
há 15 weeks 5 days atrás
há 15 weeks 5 days atrás
há 15 weeks 5 days atrás
há 15 weeks 6 days atrás
há 16 weeks 15 hours atrás
há 16 weeks 2 days atrás
há 16 weeks 2 days atrás