Caching Youtube con Squid 2.7
Posted by: Alejandro Gramajo in Linux, Software, tags: Debian, SquidHola a todos, hace tiempo que no escribiamos en el blog. Aca les dejamos una funcion interesante del proxy server Squid.
Los usuarios de Squid sabran que por lo general y por default no se puede cachear videos de Youtube. Existen algunas razones, vamos a enumerar algunas:
- El video viene de varios cache servers internos que usa Youtube (o Google) entonces la url cambia.
- Si el video se cancela no baja entero.
Para evitar lo primero, a partir de la version 2.7 se incorpora una funcion “storeurl rewrite”, lo que permite separar (parseando) la URL que utiliza para buscar en su storage interno (backend - el cache en si mismo).
De esta manera podemos crear que multiples URL destino hagan referencia al mismo contenido del backend, asi evitamos duplicacion de contenido. Muy util para CDN.
Voy a poner un ejemplo simple: El sitio example.com tiene dos servidores web y me traen la misma imagen.gif, por default en Squid se almacena como dos imagenes diferentes, si haces un rewrite del store, podemos apuntar a la misma.
http://servidor1.example.com/image.gif http://servidor2.example.com/image.gif
Podemos reescribir algo como: (sintaxis en Perl - mas info ver regex o me preguntan)
$url =~s!http://servidor\d+\.example\.com/(.*\.gif)!http://s-example.INTERNAL/$1!;
Expresion regular que tiene como funcion matchear servidor(numero) y cualquier nombre como gif, ese nombre se reemplaza en $1. Y se reescribe a un nombre de fantasia que invente yo.
Si mas o menos entienden, la idea es rescribir la url a una forma normalizada, tenemos que poner manos a la obra para Youtube.
Cuando ejecutamos un video este se va a buscar a los caches internos que tienen, y la url tiene mas o menos esta forma: (llama a una funcion videoplayback)
http://v19.lscache7.c.youtube.com/videoplayback?ip=0.0.0.0& sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor&fexp=904708%2C905208& algorithm=throttle-factor&itag=34&ipbits=0&burst=40&sver=3&expire=1264122000&key=yt1& signature=654F0FB48D631BF220381FED556AE9E905989E71.0D479B82F2C57401EDB9AEB24A41C4447DA35E47& factor=1.25&id=3e9103da619d1f28&
De esos tags podemos desprender varias cosas, pero en este caso solo nos interesa algo que identifique univocamente al video, nos quedamos con el parametro “id”.
Hacemos un rewrite asi:
$url =~s!^http://.*?/videoplayback\?.*id=([^&]+).*!http://v-youtube.INTERNAL/ID=$1!;
Si lo probamos (copiando la url por STDIN, nos devuelve por STDOUT la reescritura.
# perl /etc/squid/store.pl http://v19.lscache7.c.youtube.com/videoplayback?...&id=3e9103da619d1f28& http://v-youtube.INTERNAL/ID=3e9103da619d1f28
Y asi.
Parametros a de configuracion a modificar del squid.conf
# aca configuramos el store rewrite storeurl_rewrite_program /etc/squid/store.pl acl store_rewrite_list urlpath_regex get_video\? videoplayback\? videodownload\? storeurl_access allow store_rewrite_list storeurl_access deny all cache allow store_rewrite_list acl QUERY2 urlpath_regex get_video\? videoplayback\? videodownload\? cache allow QUERY2 # patrones para caching y que ignoremos los encabezados No-Cache refresh_pattern get_video\? 10080 90% 999999 override-expire ignore-no-cache ignore-private refresh_pattern videoplayback\? 10080 90% 999999 override-expire ignore-no-cache ignore-private refresh_pattern videodownload\? 10080 90% 999999 override-expire ignore-no-cache ignore-private
# importante para los range y que baje todo el video, y un pequeño bug con el tamaño de la url minimum_object_size 512 bytes maximum_object_size_in_memory 32 KB range_offset_limit -1 maximum_object_size 200 MB quick_abort_min -1
Y ahora la magica pieza del store rewrite.
#!/usr/bin/perl
$|=1;
while (<>) {
@X = split;
$url = $X[0];
$url =~s!^http://.*?/videoplayback\?.*id=([^&]+).*!http://v-youtube.INTERNAL/ID=$1!;
print "$url\n";
}
Solamente les dejo el ejercicio para “youtube usando videoplayback”, pero lo tengo para otros sitios de videos de Google, Metacafe, Dailymotion, Vimeo, Soapbox, BlipTV, Break, TV Uol (Brasil), y otros sitios de contenido XXX que no voy a poner aca porque Google me va a indexar y va a pensar mal de mi. Cualquier cosa me preguntan.
Miramos el access.log del squid y cuando acceso a un video (la segunda vez ya sale del cache):
1264093473.644 50428 172.22.0.153 TCP_HIT/200 9817978 GET http://v14.lscache8.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id% 2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor&fexp=903707& algorithm=throttle-factor&itag=5&ipbits=0&burst=40&sver=3&expire=1264118400&key=yt1& signature=0913DFCF267D50241CBA4C84ECBB57450287AE31.262DB100A4F3960D2B66A26591F395D84FED2526& factor=1.25&id=5a84b0718d025dea& - NONE/- video/x-flv
Hit, hit!
Nos ahorramos cada vez que ven ese video 9MB al estar en el cache.
Saludos a todos


Entries (RSS)