Archive for January, 2010

Hola 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. :-D

#!/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! :-D

Nos ahorramos cada vez que ven ese video 9MB al estar en el cache.

Saludos a todos

Comments 74 Comments »