UBUNTU + SQUID = CACHING DINAMICO DE YOUTUBE.

Imagen de chilino

Tema: 

:)

Hola a todos,

Despues de mucho tiempo, sin aportar, me reivindico con el siguiente tema que trata la aplicación un servidor proxy que contiene un appliance de caching dinamico de youtube.

Requerimientos minimos en Hardware:

Procesador: Intel Core 2 Duo
Memoria: 4GB
Disco Duro: 1TB
NICs: 2 10/100/1000Mbps, por lo menos una de 1Gbps que se conecte a la red LAN de los usuarios.

Requerimientos minimos en Software:

- Server Ubuntu instalado sobre el fierro.
- Que el server tenga seteados los parametros de red local y de acceso a Internet.
- Que el server tenga las politicas de seguridad necesarias para que los usuarios de la LAN accedan a internet.
- Que el server tenga instalado Squid 3.
- Que el server tenga instalado php 4 o 5.
- Que el server tenga instalado Perl.

Aptitudes mínimas del Implementador:

- Saber Ingles (saber leer ese ingles técnico, que a veces nos oculta el know how de las cosas).
- Ser perseverante y nunca rendirse. (la voluntad del guerrero).
- No ser como la pieza y leer a medias este documento para luego comentar que no funciona. HDP :)
- Conocer el entorno Ubuntu y tener sentido común.

Un poco de conocimiento nos libera de la ignorancia:

Según la Guia en ingles de squid-cache, osea esta: "http://eu.squid-cache.org/ConfigExamples/DynamicContent/YouTube",
el creador de este metodo "Joshua O'Sullivan", cita que se basó en una configuración tipica de Squid, sin embargo, el agrega un Script que reescribe las URL y también configura el parametro URL Rewriter en Squid, cuyo funcionamiento es el de volver a escribir todas las solicitudes destinadas a youtube, las guarda en un servidor web caching y ejecuta una busqueda de los archivos guardados y se hace match, las carga localmente desde el servidor web.

El script chequea la URL, utiliza readfile para pasar todos estos a través de una exception en la cual solo serán retenidos los archivos con extensión FLVs que necesitamos retener. Cuando estas URLS .flv son encontradas, serán abiertos para buscar el tamaño del video, la URL es desmenuzada para buscar el id del video ya que este valor es constante para el mismo video de una misma resolución.

Se genera el nombre del archivo con un formato "id-tamaño", este es el nombre del archivo que vamos a usar, esto nos permite diferenciar entre videos del mismo origen, pero de diferente resolución, también nos asegura que el video en cache no sea corrupto, es decir que tenga el tamaño correcto.

Una vez generado el archivo, se busca en la carpeta cache (web server) el archivo y si es encontrado, se lo sirve o lo entrega al usuario. La conexión a Youtube es cerrada sin ninguna data, exceptuando las cabeceras que contienen la info del archivo que ha sido descargado.

En el caso de que el archivo no es encontrado en la carpeta cache, el video es descargado en bloques y entregado al usuario, mientras simultaneamente va siendo guardado el archivo cuyo formato es "id-tamaño" en la carpeta cache.

Vamos a la configuración:

Configuración de Squid:

------------------------------------------------------------------------------

# determine which URLs are going to be caught
acl youtube dstdomain .youtube.com

# pass requests
url_rewrite_program /etc/squid/phpredir.php
url_rewrite_access allow youtube

# leave caching up to the local web server
cache deny youtube

------------------------------------------------------------------------------

Configuración del Redirector escrito en PHP:

archivo: phpredir.php

------------------------------------------------------------------------------

# !/usr/bin/php
<?php

while ( $input = fgets(STDIN) ) {
// Split the output (space delimited) from squid into an array.
$input=explode(" ",$input);
if(preg_match("@youtube@",$input[0])){
$input[0]=urlencode($input[0]);
$input= implode(" ",$input);
echo "http://10.13.37.25/per.php?url=$input"; //URL of my web server
}else
echo ""; // empty line means no re-write by Squid.
}
?>

------------------------------------------------------------------------------

Configuración del Script que busca el archivo en la cache del servidor web:

archivo: per.php

------------------------------------------------------------------------------

<?php

$file_path="/var/www/videos";
$logfile="$file_path/cache.log";
$url=urldecode($_GET['url']);
$urlptr=fopen($_GET['url'],"r");
$blocksize=32*1024;

//attempt to get. a 404 shouldn't happen, but...
if($urlptr===FALSE){
header("Status: 404 Not Found");
die();
}

//find content type and length
foreach($http_response_header as $line){
if(substr_compare($line,'Content-Type',0,12,true)==0)
$content_type=$line;
else if(substr_compare($line,'Content-Length',0,14,true)==0){
$content_length=$line;
}
}

/**Youtube will detect if requests are coming form the wrong ip (ie, if only video requests are redirected, so, we must redirect all requests to youtube.
As such, we must capture all requests t youtube. Most are unimportant, so we can pass them straight through **/
if(!preg_match("@.*youtube.*videoplayback.*@",$url)){
fpassthru($urlptr);
fclose($urlptr);
exit(0);
}

//send content type and length
header($content_type);
header($content_length);

//find youtube id;
$url_exploded=explode('&',$url);
$id="";
foreach($url_exploded as $line){
if(substr($line,0,3)==='id=')
$id=substr($line,3);
}
//Get the supposed file size
$length=intval(substr($content_length,16));
file_put_contents($logfile,"\nFound id=$id, content-type: $content_type content-length=$content_length\n",FILE_APPEND);

//Do we have it? delivar if we do
$fname="$file_path/$id-$length";
//Check if we have the file, and it is the correct size. incorrect size implies corruption
if(file_exists($fname) &&filesize($fname)==$length){
readfile($fname);
logdata("HIT",$url,$fname);
exit(0);
}

//file not in cache? Get it, send it & save it
logdata("MISS",$url,$fname);
$fileptr=fopen($fname,"w");
//no validity check, simply don't write the file if we can't open it. prevents noticeable failure/

while(!feof($urlptr)){
$line=fread($urlptr,$blocksize);
echo $line;
if($fileptr) fwrite($fileptr,$line);
}
fclose($urlptr);
if($fileptr) fclose($fileptr);

function logdata($type,$what, $fname){
$file_path="/var/www/videos";
$logfile="$file_path/cache.log";
$line="@ ".time()."Cache $type url: $what file: $fname client:".$_SERVER['REMOTE_ADDR']."\n";
file_put_contents($logfile,$line,FILE_APPEND);
}
?>

------------------------------------------------------------------------------

Que es lo que Quiero de la comunidad:

- Que aporten con investigación, para mejorar el script de Joshua y no solamente cachear youtube, sino tambien agregar mas contenido de otras paginas de video como vimeo, googlevideo, etc.
- Mantener el codigo, libre y accesible para todas los interesados, cuando me refiero a mantenerlo, es decir que si google hace un cambio en servir las solicitudes de youtube, exista personas que adapten esos cambios a estos scripts.
- Que comenten y sugueran avances a este emprendimiento.

Atentamente.

Chilino.

Comentarios

Cabp68

Imagen de chilino

Hola amigo,

Los vídeos se guardan en el directorio del servidor web, pues como indica el concepto, es descargar los archivos sobre el servidor web local (apache) que está alojado en "var/www/".

Al realizar una solicitud de vídeo al Internet, el script una verificación para ver si el vídeo se encuentra almacenado en el servidor web. Si hace match la regla, entonces esto me indica que el vídeo está almacenado, por tanto, ya no se sirve desde Internet, sino de forma local (servidor WEB), percibiendo una velocidad increíble al cargar el video (caching)!!!

Saludos.

service squid restart

Imagen de nino1511

service squid restart

tail -f squid.out
squid: ERROR: Could not send signal 0 to process 1953: (3) No such process
squid: ERROR: Could not send signal 0 to process 1999: (3) No such process
squid: ERROR: Could not send signal 0 to process 2079: (3) No such process


tail -f messages
Dec 19 15:36:58 localhost squid[2122]: Squid Parent: child process 2151 started
Dec 19 15:36:59 localhost (squid): The redirector helpers are crashing too rapidly, need help!
Dec 19 15:36:59 localhost squid[2122]: Squid Parent: child process 2151 exited with status 1
Dec 19 15:37:02 localhost squid[2122]: Squid Parent: child process 2159 started
Dec 19 15:37:02 localhost (squid): The redirector helpers are crashing too rapidly, need help!
Dec 19 15:37:02 localhost squid[2122]: Squid Parent: child process 2159 exited with status 1


service squid status
squid interrumpido pero existe un archivo pid

Páginas