Como fazer cache de vídeos do youtube no Squid
Do ano passado pra cá, o crescimento de vídeos explodiu no mundo. Um problema notado, porém, foi que os vídeos não eram cacheados no squid.
Foram criadas várias ferramentas para de redirecionamento, com menor ou maior grau de sucesso.
Aqui no trabalho, testamos uma alternativa, adicionando as linhas
acl googlevideo dstdomain .googlevideo.com
cache allow googlevideo
acl youtube dstdomain .youtube.com
cache allow youtube
no arquivo /etc/squid/squid.conf e o problema foi resolvido.
Importante. Essas linhas devem estar acima dessas duas:
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
A explicação é simples.
A RFC 2616, que define o HTTP 1.1, diz que não deve entrar no cache todo recurso que tiver na resposta os cabeçalhos:
- Cache-Control: no-cache;
- Pragma: no-cache;
- Cache-Control: no-store;
Porém, o squid, por padrão, também proíbe o armazenamento a todo conteúdo cujas URLs contenham as strings "cgi-bin" ou o sinal que delimita parâmetros, o "?" (sinal de interrogação). Nos dois casos, o squid considera que certamente o conteúdo é dinâmico, e sequer verifica os cabeçalhos HTTP.
Conforme testes, verificamos que os vídeos continham um cabeçalho de expiração de algumas horas, além de não conter instruções nos cabeçalhos para não guardá-los. O que fizemos foi inserir uma regra dizendo que não é pra descartar de cara o conteúdo de googlevideo.com e youtube.com. A regra foi colocada antes por questão de prioridade.
Pudemos, assim, cachear tranquilamente os vídeos, atentos a um pequeno detalhe. O recurso é definido pela URL de requisição, o cabeçalho Vary da resposta (quando existir) e a ETag. Assim, essas duas URL abaixo são entidades diferentes, pois não atendem ao primeiro quesito:
- http://dominio.com.br/?a=1&b=2
- http://dominio.com.br/?b=2&a=1
Se você for corajoso, pode aumentar o tempo de vida do recurso com o refresh_pattern. Se for mais corajoso ainda, retire as linhas referentes à ACL QUERY e passe a confiar nas instruções de cache de todos os servidores HTTP que entrar (o que não é tão má ideia assim).
Como última dica, deixo a de aumentar o parâmetro maximum_object_size, pois o padrão é de apenas 4 MB.
O resultado no log do squid foi o seguinte (substituí os IPs por falsos):
# tail -n 5000 /var/log/squid/access.log|grep googlevideo
1244065234.402 1478259 10.10.5.7 TCP_MISS/200 9944050 GET http://v2.lscache6.googlevideo.com/videoplayback? - ROUNDROBIN_PARENT/200.200.200.29 video/x-flv
1244065379.699 129413 10.10.5.8 TCP_MISS/200 1042113 GET http://v22.lscache1.googlevideo.com/videoplayback? - ROUNDROBIN_PARENT/200.200.200.28 video/x-flv
1244065640.822 167 10.10.5.7 TCP_HIT/200 1042121 GET http://v22.lscache1.googlevideo.com/videoplayback? - NONE/- video/x-flv
1244065709.024 1590 10.10.5.8 TCP_HIT/200 9944059 GET http://v2.lscache6.googlevideo.com/videoplayback? - NONE/- video/x-flv
UPDATE: Veja meu outro post sobre como resolver o problema da efetividade e fazer 100% de acerto nas requisições: Cache efetivo de vídeos do Youtube com Squid


luciano.pinheiro:
welllington, não aconselho a fazer cache de tudo, porque tem muita coisa dinâmica na internet. Por exemplo, carrinhos de compra e resultados da pesquisa do google.
Você pode melhorar "no geral" a performance do squid de duas formas:
1) através de refresh_pattern
2) através de helper externo com a opção external_refresh_check. Mas pra isso, você deveria sacar muito de cabeçalhos HTTP, pra não fazer besteira. Eu ainda devo fazer um post à respeito dele;
welllington:
É possivel que o squid faça cache de tudo?
Pois vejo que o meu so faz cache de imagens e arquivos java, flash mas não do html em si e isso ta causando um pouco de lentidão.
Quanto aos videos do youtube, se forem acessados varias vezes por semana o mesmo video ficará mais rápido, caso contrário ele será descartado mesmo, então é importante mesmo que haja duplicidade.|
E viva a internet mais rápida.
igorbmb:
Como fazer a cache de um video do meu site? Obrigado
Anonimo:
ola sou novo em linux gostaria de instala o squid
luciano.pinheiro:
Eu fiz esse post com a intenção primeira de mostrar o "recurso" do squid que é a negação de cache a ACL QUERY, mesmo contra as regras definidas pelo HTTP.
Um dos efeitos é a negação a todos os FLV do Youtube, e praticamente a todos os FLV gerados dinamicamente, mesmo que o servidor HTTP não indique isso.
Na verdade, hoje, há muitos conteúdos que usam o caractere "?" na url e mesmo assim não mudam por semanas. Se ficassem em cache, poderiam ser apenas validados.
O PHP, por exemplo, quando monta uma consulta MySQL, insere na mensagem de resposta HTTP o cabeçalho no-cache. Quando é uma página estática, isso não acontece. Isso significa que o recurso do squid está ultrapassado.
Quem quiser se aprofundar, pode ler a RFC 2616, capítulos 13 inteiro e 14.9 para os cabeçalhos.
Para quem ainda quiser fazer o cache do youtube, a forma mais fácil de descobrir a url do flv é com o bom e velho
# tail -f /var/log/squid/access.log | grep flv
Ou então usar o thundercache.
Anonimo:
materia antiga nao faz mais cache pq o youtube mudou faz tempo...
adilon:
eu faço a auteração la faço becap mais quando reinicio aquilo q eu tinha auterado la ja o squi tira fora .... me ajuda obrigado
Int21:
Cabra, conforme o Rodrigo Manga reportou, o cache de videos so funciona se a requisição for feita pro mesmo datacenter, eu fiz testes aqui com esta solução e o indice de acerto do videos em cache foi menor que 20% ous seja, ele ta duplicando videos vidos de outros servers. O que não ocorre com o ThundeCache (www.thundercache.org) que é uma iniciatica de brasileiros e que vem ganhando destaque internacional e de fácil entendimento. Da uma olhada no deu cache que tu vai ver. Mas de qualquer forma os parametros que peguei com vc ajudaram muito. Valeu e boa sorte.
Tobias Tromm:
Boa noite!
Parabéns pela solução. Faz tempo que eu estava procurando algo assim.
Testei aqui e funcionou corretamente.
Obrigado.
Wanderson:
Luciano,
parabens pelo artigo muito bom, gostaria de convida-lo a postar artigos tambem no site www.travou.com.br que possui dicas para nao travar a rede :)
aguardo retorno.
Francisco Raimundo:
otimo artigo, vou fazer testes aqui
luciano.pinheiro:
Rodrigo Manga, de fato, é um recurso que deve ser usado com cautela. Por isso mesmo registrei que, até se a passagem dos parâmetros for invertida, o arquivo é guardado de novo.
Só que, mesmo assim, tem muita gente que gostaria de fazer o cache e acaba usando programas de terceiros em python mesmo sem saber como funcionam.
Note que a técnica vale não somente para cache no youtube, mas também pra qualquer outro. É só verificarmos como são passados os parâmetros. Normalmente Globo, Terra e Uol têm subdomínios próprios para vídeo. Em dias de notícias importantes, eles acabam atolando nosso link.
Quanto a encher o cache, temos que olhar a questão da política de reposição (opção cache_replacement_policy do squid). Por padrão, o squid usa a LRU (least recently used), que diz que devem ser removidos os arquivos mais antigos no caso de estar o disco cheio (além de outros fatores que podem ser lidos aqui). Normalmente, os arquivos são removidos entre 1 e 10 dias. Existem outros modelos de políticas suportados.
Sidnei:
Parabéns cara,
entrei aqui para ver um artigo de linux, e acabei viajando em teorias de evolução e tudo mais. Textos muito bem escritos.
Conseguiu me prender aqui por horas hehe.
Abraços
Rodrigo Manga:
Se o youtube mandar o video de um data center diferente (dominio diferente), vc vai ter videos duplicados, é só monitorar q vc vai ver isso.
Tiago Cruz:
Meus parabens, muito boa dica, e muito bem explicada!
Wilson Giordani de Souza:
Parabéns. Informações valiosas.
Cristiano:
parabens pelo artigo bom d+ mesmo!!!!
Enviar novo comentário