LINUX, SQUID 3.1 = CACHE DE VIDEOS YOUTUBE.

Imagen de chilino

Tema: 

Continuando con el desarrollo de este blog, se adjuntan los requerimientos:

Requerimientos de Hardware:

CPU: Intel i3
RAM: 4GB
HDD: 1TB o más
NETWORK:
- 2 tarjetas de red de 1Gbps.
- 1 switch de 16 o 24 puertos de 1Gbps
- Todas las computadoras en red conectadas a 1Gbps

Requerimientos de Software:

- Distribución Linux instalada con Squid y Apache (ultima versión): Yo usé Ubuntu.
- Servidor con acceso a internet, que ya se tenga a la red lan con acceso a internet y redireccionada las peticiones hacia el Proxy Squid.
- Lenguajes de programación instalados: php 4 o 5, Perl.

Referencias:

http://eu.squid-cache.org/ConfigExamples/DynamicContent/YouTube
https://github.com/kulbirsaini/videocache

Funcionamiento del Cache:

"Joshua O'Sullivan" autor de VideoCache, cita dos formas cachear videos. La primera es usando un servidor web local y la segunda es un Squid Storage De duplication. La que se describe en este blog es el método usando el servidor web local.

Entonces como funciona?

El usuario de la LAN realiza una petición de video a Youtube por ejemplo: https://www.youtube.com/watch?v=SJ5QcukDypk esta petición llega al gateway de la red e internamente redirige la petición a un script que verifica si el video se encuentra en el repositorio en el servidor web para servirlo directamente al usuario, si no se encuentra descargado, simplemente redirecciona a internet para que se descargue el video, se muestre al usuario y se guarde sobre el servidor web local.

De lo verificado a fecha actual (enero-2015), se verifica que Joshua como Kulbir han migrado la configuración a python, lo cual hace que entender el software sea mas claro, además de ser estructurado y escalable.

Configuración de Squid:

Esta parte de aquí la subiré en estos días... por ahora se mantiene la configuración con PHP.

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

# 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

saber

amigo los vidos descargado donde se almacenan si en el scrip veo que no direcciona a ninguna base de datos

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.

Chilino

Tengo un problema al llamar

Imagen de nino1511

Tengo un problema al llamar los archivos per.php y phpredir.php, al llamar al archivo phpredir.php se me cae el squid a que se debe?, uso centos y squid3, dentro del archivo empiezo con la linea: # !/usr/bin/php

rpm -q php
php-5.3.2-6.el6.i686

Saludos

Vamos Ecuador, si se puede

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

Vamos Ecuador, si se puede

Los procesos del redirector

Imagen de deathUser

Los procesos del redirector están muriendo muy rápido antes de alcanzar a responder las solicitudes ...

Puede ser que haya un error de sintaxis en el programa, revisa los .php a ver si no te da errores en la ejecución.

bye
;)

Páginas