Squid cache – Parte 2

Squid no es solamente un servicio de proxy y cache, puede hacer mucho mas: manejar acl (listas de acceso), filtrar contenido, hasta puede hacer filtrado ssl aun en modo transparente (método de proxy – sin tener que configurar en las opciones de proxy de sus navegadores, es como man in the middle, nadie sabe que esta ahí). Entonces comúnmente veo como se desperdicia todo el potencial de esta aplicación por no saber configurar cada una de sus partes.

Ahora lo interesante que hace squid es el cache (en mi opinión). Tu me dirás ¿para qué hacer cache?, la razón es sencilla, administrar mejor el uso de tu velocidad y ancho de banda, es lo primordial. Piensa detenidamente, 1000 personas en tu empresa consultando cada 5 minutos, paginas en común, Google, Hotmail, Gmail, etc… para que vas a descargar una y otra vez imágenes, baners, publicidad, contenidos html, todo esto son cosas estáticas, no cambian tan frecuentemente, mejor tenerlas almacenadas en tu red local y entregas una copia que consideras reciente dentro de las configuraciones que consideraste.

¿Cómo se hace?, sencillo con la siguiente sentencia:

refresh_pattern [-i] regex min percent max [options]

Como siempre digo, no crean en todo, asi que te invito a leer de la fuente oficial. Te recomiendo leer el manual de esta sentencia AQUI

La sentencia refresh_pattern siempre sera nuestra etiqueta para agregar nuevos parámetros para hacer cache.

Importante tus listas de cache deben ser secuenciales, porque una vez haga match con la primera en que coincida con el objeto no seguirá leyendo tus demás reglas

Las expresiones regulares diferencian mayúscula de minúsculas, por tanto no es lo mismo flv que FLV pero puedes evitar esto si así lo deseas usando la opción -i . Entonces quedaría así refresh_pattern -i

‘Min’: es el tiempo (minutos) en que un objeto sera considerado como «reciente o fresco» y si no tiene alguna etiqueta explicita de «expirado». Por defecto squid recomienda que sea 0, por cuestiones de que algunas aplicaciones dinámicas pueden comportarse extraño, puro blah blah blah, realmente este valor debe ser un numero que tu consideres útil y efectivo para los elementos que deseas hacer cache, ejemplo: jpg, 1440 minutos(un día) me parece bien, no es como que si en una pagina cambian las imágenes de un post cada 5 minutos.

‘Percent’ es el porcentaje que de la edad de un objeto(desde la ultima modificación) sera considerado «reciente o fresco». Te explico, puede que haciendo un reload o refresh constante para ver las ultimas modificaciones que se hicieron en una pagina web, squid podría considerar si ya tiene digamos un 50% del tiempo cumplido entre min y max, volver a descargar ese objeto de internet y darte una copia nueva.

‘Max’ es el limite por encima o igual que ‘Min’ de que tanto tiempo un objeto es considerado «reciente o fresco», supongamos que una imagen de alguna pagina solo fue consultada una vez por un usuario, ese objeto ya cumplió su tiempo min, pero no el max, entonces cuando sea consultado nuevamente, se entregara una copia de cache.

Options:
override-expire
override-lastmod
reload-into-ims
ignore-reload
ignore-no-store
ignore-private
max-stale=NN
refresh-ims
store-stale

Estas opciones se hicieron en su mayoría para ignorar comportamientos preestablecidos en lenguajes y protocolos, para así garantizar el uso efectivo del cache.

override-expire

Refuerza el tiempo mínimo de un objeto, aun cuando el servidor envié un tiempo de expirar menor(ejemplo cosas como header o Cache-Control: max-age). Si hacemos esto saldrá un «warning» diciendo cosas como esta «VIOLATES the HTTP standard» pero eso es solo advertencias que podemos ignorar. Ahora si el tiempo que envía un servidor es mayor entonces squid tomara el tiempo (de vencimiento) del servidor

override-lastmod

Refuerza el tiempo mínimo de un objeto,  aunque ese objeto haya sido modificado recientemente.

reload-into-ims

La explicacion corta, es que evita que cuando pulsamos el botón de refrescar o hacemos una petición no-cache, squid entregara cache si no ha sido «modificado desde» y/o si no existe algún «headers» en la pagina

ignore-reload

Ignora la acción de los usuarios de presionar el botón de recargar o refrescar pagina

ignore-no-store

IIgnora cualquier regla en «headers» de no hacer cache, por ejemplo de vídeos

ignore-private

Ignora cualquier regla en «headers» de contenido privado que no se debe hacer cache, ejemplo: contenido de facebook.

refresh-ims

Squid contacta con el servidor, para garantizar si el objeto es el mas nuevo. Si lo es entonces entregara cache

store-stale

Squid guardara todas esas respuestas, incluso si no tienen fecha de caducidad, esto es muy poco practico debido a que usualmente no pueden ser reutilizadas. Si decides habilitarlo debes declarar max-stale=NN

max-stale=NN

Si habilitaste lo anterior, debes declarar un tiempo máximo de vida para esa respuesta o factor. Squid no entrega objetos de este estilo sino lo puede validar con la fuente

Aquí les dejo una tabla de como funciona el estado de fresco «FRESH» según los valores que hemos hablado:

  • FRESH if expire > now, else STALE
  • STALE if age > max
  • FRESH if lm-factor < percent, else STALE
  • FRESH if age < min else STALE

Aquí una configuración de ejemplo para una empresa en especifico con mucho espacio en disco, buenos equipos y buen ancho de banda

refresh_pattern -i \.(3gp|7z|ace|asx|bin|deb|divx|dvr-ms|ram|rpm|exe|inc|cab|qt)$ 43200 99% 43200 ignore-no-store ignore-must-revalidate override-expire override-lastmod reload-into-ims

refresh_pattern -i \.(rar|jar|gz|tgz|bz2|iso|m1v|m2(v|p)|mo(d|v)|arj|lha|lzh|zip|tar)$ 43200 99% 43200 ignore-no-store ignore-must-revalidate override-expire override-lastmod reload-into-ims

refresh_pattern -i \.(jp(e?g|e|2)|gif|pn[pg]|bm?|tiff?|ico|swf|dat|ad|txt|dll)$ 43200 99% 43200 ignore-no-store ignore-must-revalidate override-expire override-lastmod reload-into-ims

refresh_pattern -i \.(avi|ac4|mp(e?g|a|e|1|2|3|4)|mk(a|v)|ms(i|u|p)|og(x|v|a|g)|rm|r(a|p)m|snd|vob)$ 43200 99% 43200 ignore-no-store ignore-must-revalidate override-expire override-lastmod reload-into-ims

refresh_pattern -i \.(pp(t?x)|s|t)|pdf|rtf|wax|wm(a|v)|wmx|wpl|cb(r|z|t)|xl(s?x)|do(c?x)|flv|x-flv)$ 43200 99% 43200 ignore-no-store ignore-must-revalidate override-expire override-lastmod reload-into-ims
cache_mem 8092 MB

Ahora el cache no es solo en disco duro, también podemos hacer cache en memoria ram, este valor es por cada proceso squid, así que debes tomarlo en consideración cuando usas redirectors como squidGuard

maximum_object_size_in_memory 1024 KB

El tamaño máximo del objeto en memoria que squid almacenara en RAM. También puedes declarar un mínimo.


memory_replacement_policy heap GDSF
cache_replacement_policy heap GDSF

Como ven uno es la política para el remplazo de cache en memoria RAM y otra en disco duro. Existen 2 políticas GDSF y LFUDA. La primera busca mejorar el porcentaje de aciertos de cache, teniendo muchos objetos pequeños a la mano, el segundo busca lo contrario, el mantiene objetos en cache sin importar su tamaño.

La pregunta que me imagino que me estas haciendo en este momento es ¿Cuál uso?, bueno si tu consideras que en tu entorno hacen muchas consultas y pocas descargas usa GDSF si por el contrario hacen muchas descargas y pocas consultas LFUDA. Eso si te recomiendo LFUDA cuando vas a hacer, no se, cache en 1TB de disco, es mas eficiente.

maximum_object_size 4 MB

El tamaño máximo que puede tener un objeto para ser almacenado

cache_dir aufs /media/proxy249/cache 100 16 256

Donde estará almacenado el cache, atención aquí, importante es si usas ufs, aufs o diskd, los 3 funcionan mas o menos igual, la diferencias esta es que aufs y diskd trabajan con procesos separados para hacer las operaciones I/O en disco duro y evitar que los procesos de squid se queden colgados durante estas operaciones, adicionalmente diskd puedes especificar la cantidad de hilos que vas a disponer para esta tarea. Yo recomiendo aufs si tienes un buen equipo.

Tamaño 100 (megas), puedes colocar 100000 son casi 100GB depende de tu disponibilidad. 16 es el numero de carpetas, y 256 es el numero de sub-carpetas. Puedes jugar con ambos valores depende de que tan rápido sean tus discos y que tanto recursos tienes.


cache_swap_low 90
cache_swap_high 95

Estas opciones son los valores de reemplazo de objetos, es el valor mínimo y máximo como marca de agua según squid, donde estos números son en porcentaje (%), y en cache muy pequeños un 5% como esta ahorita serian digamos 300 objetos por segundos, pero en caches muy grandes estaríamos hablando de miles de MB

Bueno ahí les dejo, esto por ahora, comenten y también tome en consideración aquellos que me decían que no podían hacer cache y filtrado de paginas https (SSL) en squid 3.5 o superior, se los traeré pronto, permanezcan atentos a este blog.


11 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   Ing. Jose Albert dijo

    Excelente complemento a la primera parte!

    Hay mucha literatura al respecto sobre Squid, pero ir al grano en sus opciones más practicas con sus respectivas aclaratorias y posibles escenarios reales de uso no siempre se encuentran a la mano!

    Como siempre, espero ansioso la tercera parte del mismo!

    1.    BrodyDalle dijo

      Gracias por tu comentario. Es correcto, una explicación concisa de todos lo elementos relevantes, y unas configuraciones de las mejores practicas. Sin embargo siempre estoy atento a sus comentarios y propias experiencias.

  2.   artus dijo

    Hola tengo un problema con las actualizaciones de windows y los antivirus. Tengo aproximadamente 120 pc en mi institución. Me podrías dar una idea de como mejorar esta situación. Gracias por tu ayuda y felicitaciones por el artículo.

    1.    BrodyDalle dijo

      hola, gracias por participar.. pues si te puedo ayudar, pero explícame bien cual es tu problema, no puedes descargar las actualizaciones? colocaste proxy en opciones de Internet e igual en las opciones de proxy de tu navegador?, revisaste los puertos?, o es que quieres hacer cache de esas actualizaciones?

      1.    artus dijo

        Lo que necesito es que cada vez que un equipo descargue una actualización de windows o del antivirus, ésta se quede en el cache por un periodo de un mes aproximadamente, de esta forma quisiera ahorrar ancho de banda, dado que todas las mañanas cada vez que inician todas las computadoras empiezan a descargar las mismas actualizaciones cada una y se satura la conexión.

        Gracias por tu ayuda.

    2.    Mario dijo

      Un servidor con Squid sirve, ya que son simples descargas http sin cifrar. Otras soluciones para cache son WSUS y Altiris, normales en empresas.

      1.    artus dijo

        Gracias Mario lo tendré en cuenta.

    3.    BrodyDalle dijo

      ok listo, entiendo, checa este enlace. http://wiki.squid-cache.org/SquidFaq/WindowsUpdate. para hacer cache de antivirus, tienes que saber de donde se descargan las actualizaciones y bajo que extensión (ejemplo .exe) y hacer cache de la misma…

  3.   artus dijo

    Gracias por tu ayuda.

  4.   Erick dijo

    Buenos dias amigos, podrian apoyarme con mi caso . puesto que tengo squid 2.7 .STABLE9 en un debian 6 , y tengo todo configurado y al montarlo en un entorno de 10 pc , me correo normal , el problema radica cuando lo monto para 90 pc , solo dura unos segundos funcionando y de ahi todos se quedan sin internet . Podrian apoyarme ?

  5.   JOSE RIVAS dijo

    Excelente explicación, básica pero muy clara y precisa. En lo personal la mejor explicación que he podido leer.
    Tengo una duda ¿es posible hacer cache de aplicaciones para Android como las apk y xapk?
    Y, cual sería la forma correcta para configurar cache dinámico cualquiera que fuese el origen de los archivos?
    Uso pfSense 2.4.5.