Fev 08 02:19

Cache efetivo de vídeos do Youtube com Squid

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.

AnexoTamanho
inComum.tar.gz2.65 KB

Responder

O conteúdo deste campo é privado não será exibido publicamente.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Linhas e parágrafos são quebrados automaticamente.

Mais informações sobre opções de formatação