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

ejecuta los php solos y mira

Imagen de deathUser

ejecuta los php solos (en la consola, si es posible con el usuario que se ejecuta squid) y mira si dan errores de sintaxis o similares ...
agrega salidas hacia logs en los .php para ver hasta donde se está ejecutando, etc ...

bye
;)

Informes.

Imagen de chilino

Por favor, indicar si les ha salido esta configuración, si lo requieren puedo hacer un video en youtube y colgarlo.

Chilino

El manual es chevere y

Imagen de nino1511

El manual es chevere y sencillo de implementar pero tengo ese problema de que el squid no inicia cuando llama al archivo .php

Saludos

Coloca el video

Vamos Ecuador, si se puede

Probaste con subir el nivel

Imagen de deathUser

Probaste con subir el nivel de log en el php.ini y mirar en los logs de php a ver si te reporta algo al ejecutar los archivos .php ...???

Ejecutaste los archivos con el usuario con el que se ejecuta squid ...???

bye
;)

Páginas