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

74 Responses to “Caching Youtube con Squid 2.7”
  1. Jahvier says:

    Muy interesante logre hacer el cache de youtube, estube buscando informacion y solo la encontraba en thailandes y los traductores poco podian hacer, si alguien mas necesita hacer el cacheo en smoothwall, sigan estos pasos:

    entramos a la consola con putty y en la terminal:

    crear la carpeta /etc/squid

    root$ mkdir /etc/squid

    despues creamos el script en perl para cambiar las direcciones

    root$ vi /etc/squid/store.pl

    lo llenamos con el codigo q nos proporciono el buen Alejandro Gramajo:

    #!/usr/bin/perl
    $|=1;
    while (<>) {
    @X = split;
    $url = $X[0];
    $url =~s!^http://.*?/videoplayback\\?.*id=([^&]+).*!http://v-youtube.INTERNAL/ID=$1!;
    print \"$url\\n\";}

    ponemos permisos de ejecucion a nuestro script

    root$ chmod 755 /etc/squid/store.pl

    Ahora editamos el archivo de configuracion alterno de nuestro Smoothwall

    root$ vi /var/smoothwall/proxy/advanced/acls/include.acl

    y lo llenamos con el codigo:

    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

    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
    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

    Ahora solo reiniciamos el servicio de Advanded web proxy desde la interface web y listo!

    Y como peticion podrias colocar los demas sitios q mencionas, sobre todo los xxx … gracias y saludos

  2. Ariel says:

    Hola,, segui la guia talcual,, pero queria consultar lo siguiente
    No se porque cuando habilitos estas reglas el proxy me comienza a rechazar las conexiones.
    Puede ser por alguna acl ???

  3. Ariel, seguramente tenes que revisar tus ACL.

    Saludos,
    Alejandro

  4. Ariel says:

    Gracias,, en este ejemplo hace referencia a alguna acl ?? perdona que te pregunte pero soy nuevo en esto

    porque veo esto
    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

    y no me queda claro

  5. Ariel,

    El ejemplo que puse no tiene una configuracion completa de Squid, solamente es la parte para redirigir el store al script.
    Ese ACL que estas viendo es solo para “matchear” parte de las URL de Youtube.

    La configuracion que te viene por default en Squid es completa, deberias agregar tu red interna.
    Algo como esto.

    acl mynetworks src 192.168.1.0/24 192.168.2.0/24
    http_access allow mynetworks

    Y revisar el orden, ya que despues de eso debe haber un deny.

    Saludos

  6. Ariel says:

    Gracias nuevamente,, el problema que descubri es que cuando habilito la linea
    storeurl_rewrite_program /etc/squid/store.pl , squid no inicia. El archivo lo tengo creado en el directorio, lo que no se si funciona.
    es una Debian 5 .
    Como puedo probar si el archivo perl funciona correctamente ?

  7. Le diste los permisos de ejecucion?

    # chmod a+x /etc/squid/store.pl

    Verifica si no pusiste un error sin querer asi:

    # perl -c /etc/squid/store.pl
    /etc/squid/store.pl syntax OK

    Espero que sirva.

    Me parece que necesitas consultoria de BAICOM Networks! Jeje

    Saludos

  8. Ariel says:

    fecticamente me devuelve un error al ejecutar el script:

    Can\’t find string terminator \’\"\’ anywhere before EOF at /etc/squid/store.pl line 7.

  9. Ariel says:

    Gracias… Ya lo solucione.. era un espacio en el scripts, que no debia estar.

  10. jesus says:

    Hola, llegué a este artículo navegando en google, una felicitación por compartir con los que no somos tan avanzados en estos temas tus conocimientos…
    Tengo en producción un server con smootwall 3 con advanced proxy instalado, llevé a cabo los pasos que Jahvier tan amablemente compartió con nosotros, y cuando lo habilito se muere squid, revisando los logs me da lo siguiente:

    The store_rewriter helpers are crashing too rapidly, need help!

    Problemas de hardware no creo, pues es un cpu nuevo, con tarjeta madre intel y un celeron 430 a 1.8 ghz.

    Ojalá puedan ayudarme, pues en mi red más del 60% del tráfico es a youtube, y si puedo cachear los videos realmente seré feliz :)

    Muchas gracias!!

  11. Hola Jesus. Gracias por tus comentarios.

    Revisaste los permisos del script en perl como pusimos arriba?

    Saludos

  12. jesus says:

    Hola gracias por contestar, ya revisé, y el problema que tenía es que utilicé las líneas de código tal como las puso Jahvier, el problema es que hay que eliminar las \\\\ dobles, dejando únicamente una \\; al momento lo estoy probando y funciona fabuloso, solo una pregunta, es conveniente vaciar el caché de squid cuando ya llegue a determinado tamaño para evitar que empiece a dar errores o se ponga lento? Lo tengo instalado en un disco duro de 250 gigas, y pienso que de acuerdo a la carga que tiene podría llenarse tal vez en un mes o algo así, algún consejo?
    Muchas gracias por tu ayuda!!

  13. Jesus, si lo dejas tal cual esta la expiracion se producira de manera automatica podes jugar con estos valores

    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

    Podes reemplazar 999999 es la cantidad de tiempo en minutos que un objeto recide sin expiracion explicita.

    Y por otro lado el squid no consume mas espacio que lo que vos definis en cache_dir, por defecto:

    cache_dir ufs /var/spool/squid 100 16 256

    Mi recomendacion si tenes 20g y que arme una estructura de directorios mayor:

    cache_dir ufs /var/spool/squid 20000 64 256

    Saludos

  14. jesus says:

    Muchas gracias por los consejos, voy a probar algunos días, y a ver que tal funciona :)
    Muchs gracias de nuevo!!!

  15. jesus says:

    Hola he estado probando el script y ha funcionado bien, salvo el detalle que al parecer los videos expiran en algunos días, pero si me está ahorrando algo de tráfico; tengo una duda, yo al menos me entiendo razonablemente bien con la línea de comandos, pero no se programación :( viendo en los foros de smoothwall hay una contribución que hace caché de actualizaciones de windows y antivirus, pongo a continuación el enlace http://community.smoothwall.org/forum/viewtopic.php?f=26&t=23480 , y entiendo que squid no soporta más de un redirector, al menos en smoothwall; habrá alguna forma de combinar ambos códigos, para así poder cachear youtube y actualizaciones en forma simultánea? En verdad que esto sería fabuloso.
    Saludos!!

  16. kakasi says:

    Hola, quisiera saber si es posible hacer eso con el squid pero en windows? (ya se que linux es mejor pero por X motivos tengo que usar windows en ese servidor)

  17. Hola Jesus,
    podes combinar ambas cosas sin problemas, pero en este caso no te vale la pena, ya que con squid podes cachear sin problemas los updates de MS y otros, aca te dejo algunos refresh que yo uso, tambien podes usar tags como override-expire para no darle importancia a cuando el sitio de obliga a expirar los archivos, pero esto puede traer otros problemas.

    refresh_pattern -i \.gif$ 10080 100% 43200
    refresh_pattern -i \.jpg$ 10080 100% 43200
    refresh_pattern -i \.jpeg$ 10080 100% 43200
    refresh_pattern -i \.bmp$ 10080 100% 43200
    refresh_pattern -i \.mid$ 10080 100% 43200
    refresh_pattern -i \.wav$ 10080 100% 43200
    refresh_pattern -i \.ico$ 10080 100% 43200
    refresh_pattern -i \.yim$ 10080 100% 43200
    refresh_pattern -i \.jar$ 10080 100% 43200
    refresh_pattern -i \.ldict$ 10080 100% 43200
    refresh_pattern -i \.swf$ 10080 100% 43200
    refresh_pattern -i \.class$ 10080 100% 43200
    refresh_pattern -i \.cab$ 10080 100% 43200
    refresh_pattern -i \.flv$ 10080 90% 999999 override-expire
    refresh_pattern windowsupdate\.microsoft\.com/.*\.(cab|exe|psf) 4320 100% 120960 reload-into-ims
    refresh_pattern update\.microsoft\.com/.*\.(cab|exe|psf) 4320 100% 120960 reload-into-ims
    refresh_pattern office\.microsoft\.com/.*\.(cab|exe|psf) 4320 100% 120960
    refresh_pattern windowsupdate\.com/.*\.(cab|exe|psf) 4320 100% 120960 reload-into-ims
    refresh_pattern download\.microsoft\.com/.*\.(cab|exe|psf) 4320 100% 120960 reload-into-ims
    refresh_pattern microsoft\.com 4320 100% 10080

    Seguramente cuando tenga un poco de tiempo voy a ampliar la configuracion del squid en este post o en otro con mas features para cachear otros contenidos.

    Saludos

  18. Hola Kakasi, podes usar Squid en Windows, y en cuanto al script de Perl vas a tener que instalar algun interprete como ActiveState Perl.

    No es recomendable en terminos de performance utilizar Windows, pero sino te queda otra, mucha suerte!

    Saludos

  19. jorge villafuerte says:

    en ubuntu server como haria para hacer cache de videos una ayuda estoy verde

  20. Jesusovich Apéstegui says:

    Hola Alejandro, me ha sido de gran ayuda la información brindada muchas gracias. Tengo instalado el Squid 2.7 en un centOS 5.4 y todo funciona correctamente; quisiera seguir fortaleciendo mi proxy, te agradecería bastante si me ayudaras a completar el cacheo de otros sitios como los videos de google y Metacafe, cuál es el procedimiento que debo seguir o qué algoritmos debo agregar al script. Entiendo que debo agregar al script algo como:

    $url =~s!^http://.*?/videoplayback\\?.*id=([^&]+).*!http://v-youtube.INTERNAL/ID=$1!;

    como lo haría para los otros casos??… también usan videoplayback??

    Un cordial saludo Alejandro =D

  21. rcpimeki says:

    Hola, me sale esteos mensajes:
    2010/04/07 17:17:07| cache_cf.cc(346) squid.conf:128 unrecognized: ‘storeurl_rewrite_program’
    2010/04/07 17:17:07| cache_cf.cc(346) squid.conf:130 unrecognized: ‘storeurl_access’
    2010/04/07 17:17:07| cache_cf.cc(346) squid.conf:131 unrecognized: ‘storeurl_access’

    Tengo Debian 5 y squid3 Version 3.0.STABLE8

    ya hice
    # chmod a+x /etc/squid3/store.pl

    # perl -c /etc/squid3/store.pl
    /etc/squid3/store.pl syntax OK

    hay que instalar algo adicional?

  22. Diego says:

    Hola Alejandro,

    Muchas gracias por el aporte que generas, es un apoyo enorme a toda la comunidad.

    Sin embargo, mi consulta es: como podemos determinar que tal sitio (Metacafe, BlipTV, Break, etc.) utilizan VIDEOPLAYBACK… en que nos tenemos que basar o como podemos buscar esta info a fin de poder generar nuestros propios SCRIPTS de configuracion sobre el SQUID.

    De antemano agradezco tu sabia respuesta.

    Saludos.

  23. Rcpimeki, en squid 3 se llaman los tag de otra manera, fijate en la doc o instala con apt-get el squid 2.7 esta disponible.

    Diego, próximamente voy a ampliar el articulo con otros sitios para caching, para agregar hay que analizar cada sitio en particular que funcion llama y descarga el flv.

    Saludos,
    Ale

  24. Omar K says:

    Me podrias pasar a mi email las otras configuraciones que tienes para los otros sitios como Metacafe y tube8

    Muchas gracias

  25. Diego says:

    Hola Ale

    Gracias por tu valiosa información, sabes que he estado ampliando el script de perl, con el fin de almacenar en la cache, videos de otras webs; por tanto, he desarrollado uno que detallo a continuaciòn y de la misma manera, quisiera conocer tus comentarios acerca de este emprendimiento.

    Lo he probado colocando variables estaticas, con links de diferentes sitios, dando resultados satisfactorios a nivel del script.

    !——————————————————— 0 ———————————————————!

    #!/usr/bin/perl
    $|=1;
    while () {
    @X = split;
    $url = $X[0];
    if ($url =~ /([0-9A-Za-z_+]*\.flv)/) {
    $url =”http://v-proxy.INTERNAL/ID=$1″;
    print “$url \n”;
    #print “$1 \n”;
    }
    elsif ($url =~ /(get_video|videodownload|videoplayback)?/) {
    if ($url =~ /.*id=([^&]+).*/) {
    $url = “http://v-proxy.INTERNAL/ID=$1″;
    print “$url \n”;
    #print “$1 \n”;
    }
    }
    else {
    print $x . $_ . “\n”;
    }
    }

    !——————————————————— 0 ———————————————————!

    Como se puede apreciar el script es bastante generico, es decir, que se podria cachear todo lo referente a videos de cualquier sitio, si tienen esa sintaxis (casi la mayoria)… Por tanto, si se requiere colocar seguridad unicamente para cachear ciertos dominios, lo pueden controlar en el fichero squid.conf con la ACL dstdomain.

    Saludos Cordiales.

  26. Carlos says:

    Probaste si te funciona con la nueva modificacion de las URL de youtube? watch?
    me podras mandar a mi mail tu script?

    por otro lado, queria consultarte algo que no me cierra.
    en tu script creaste esta linea: $url =~s!^http://.*?/videoplayback\\?.*id=([^&]+).*!http://v-youtube.INTERNAL/ID=$1!;
    se puede reemplazar por ejemplo videoplayback por watch? o la nueva url de youtube??, ya que en la nueva URL el ID no existe.

    Saludos.. muy buen doc.

  27. ardilla says:

    Buenas a tod@s,
    tengo una duda tras leer esto, que por un lado me viene bien, pero otro lado me gustaria saber si hay forma de guardar en el log del Squid las URL de los videos visitados…

    me gustaria tener un registro de los videos que se han visto pero por defecto eso no puedo verlo en el log.

    Conoceis algun modo??

    salu2

  28. carlosch says:

    Esto funciona actualmente ? , porque creo que youtube cambio de sintaxis y varios ejecutables como videocache dejaron de funcionar

  29. kakasi says:

    Podrian ayudarme para hacer trabjar esto en windows usando el cygwin y el squid 2.7 stable 8 (version windows) ???? Estoy en las nubes .

  30. kakasi says:

    OK, ya lo solucione, funciona, muchisimas gracias Alejandro.

    Solo una consulta sobre este comentario

    # importante para los range y que baje todo el video, y un pequeño bug con el tamaño de la url

    Los valores de los object_size deben ser esos para evitar problemas? y podrias explicar a que te refieres con el bug de url, es decir con que parametro lo genero /soluciono. ??

  31. kakasi says:

    Por cierto , para hacerlo funcionar en windows puse esta linea

    storeurl_rewrite_program C:/cygwin/bin/perl.exe C:/cygwin/usr/local/bin/store.pl

    Funciona, pero no se si fue la opcion mas optima, como dije antes estoy en las nubes .

  32. kakasi says:

    Lo malo que al parecer cada vez que se abre video de youtube se activa un proceo perl.exe , he estado probandolo 10 minutos y cuando vero el administrador de tareas aparecen como 8 procesos perl.exe .

    Tambien he notado que ya no cargan las imagenes que tenia cacheadas , es decir antes de colocar el codigo para el youtube, cargaban las paginas rapidamente porque ya las tenia en el cache, pero al poner el codigo al parecer esto ya no trabaja asi y demora en cargar las imagenes, no se si sea una incompatibilidad, yo he trabajado con el siguiente codigo

    refresh_pattern -i \.gif$ 20000 90% 40000
    refresh_pattern -i \.jpg$ 20000 90% 40000
    ….

    Por cierto yo tengo la version de squid con delay pools, tendra algo que ver?

  33. elbrutox says:

    Se puede usar refresh_pattern con acls ?

    Algo asi quiero hacer

    acl static_images urlpath_regex -i \.(jpg|jpeg|gif|png)$
    cache allow static_images
    refresh_pattern static_images 0 20% 4320

  34. kakasi says:

    En windows cachea pero la primera vez que carga se demora el doble , es asi en Linux?

    Y por ejemplo este video no carga

    http://www.youtube.com/watch?v=TTp_D2i92jU

    A ustedes les carga?

  35. Percy SE says:

    Chino,
    muy interesante, y dime en Squidnt como sería, bueno si no es mucha molestia

  36. pitufo77 says:
    To use reCAPTCHA Mailhide, you have to sign up for a public and private key, you can do so at http://mailhide.recaptcha.net/apikey