miércoles, 6 de abril de 2011

Sobre Memcached, Apache2 y Drupal



Llega un momento en la vida de un sitio web levantado con Drupal(este es mi caso) en que, bien por el número de visitas o por la complejidad de las consultas, se hace necesario instalar y configurar un sistema de cacheo de contenido que agilice el proceso de envío de información.

No voy a entrar en que si proxy inverso, APC o mil gaitas, sólo trataré el proceso de instalación y configuración de memcache ejecutado en una máquina corriendo Debian GNU/Linux 6.0 Squeeze y Apache2 un sitio web con Drupal 6. Comenzamos descargando y activando el módulo "Memcache API and Integration" del sitio drupal.org.

A continuación, lo primero que debemos hacer es actualizar las fuentes de nuestra distribución Debian GNU/Linux:
[root@localhost] aptitude update

Una vez finalizado el proceso instalaremos dos paquetes:
  • memcached: "daemon" o servicio de cacheo diseñado específicamente para que los sitios web dinámicos decrementen la carga de las bases de datos almacenados objetos en memoria. Danga Interactive desarrolló memcached para mejorar la velocidad de LiveJournal.com un sitio que tuvo más de 20 millones de vistas de páginas dinámicas cada día para 1 millón de usuarios con un puñado de servidores web y un puñado de servidores de base de datos. memcached reduce la carga de la base de datos a casi nada, mejorando los tiempos de carga de las páginas para los usuarios, la utilización de los recursos y haciendo más rápido el acceso a las bases de datos.
  • php5-memcache y php5-memcached: Extensión que permite a las aplicaciones escritas en PHP5 comunicarse con los servidores memcache.
Como (casi) siempre en Debian GNU/Linux:
[root@localhost] aptitude -y install php5-memcached php5-memcache memcached

Si este paso se ha ejecutado correctamente debemos configurar qué tipo de estrategia hash utilizará memcache para manejar los objetos de la caché. Dos opciones : standard o consistency. Por lo que leído la tendencia es utilizar esta última, ya que si estamos trabajando con varios servidores memcache evitaríamos problemas al tener que compartir una misma instancia de ejecución de PHP-Apache2. Resumiendo:

Añadimos:

memcache.hash_strategy="consistent"
al fichero /etc/php5/apache2/php.ini.

Modificamos el fichero settings.php de nuestro sitio Drupal y añadimos:


$conf = array(
// The path to wherever memcache.inc is. The easiest is to simply point it
// to the copy in your module's directory.
'cache_inc' => './sites/default/modules/memcache/memcache.inc',

'memcache_servers' => array(
'localhost:11211' => 'default',
'localhost:11212' => 'content',
'localhost:11213' => 'filter',
'localhost:11214' => 'menu',
'localhost:11215' => 'page',
'localhost:11216' => 'views',
),
'memcache_bins' => array(
'cache' => 'default',
'cache_content' => 'content',
'cache_filter' => 'filter',
'cache_menu' => 'menu',
'cache_page' => 'page',
'cache_views' => 'views',
),

Lo realmente curioso de esta configuración para Drupal6, o por lo menos a mi llama mucho la atención, es la posibilidad de dedicar distintas máquinas a diferentes objetos de cache: views, menús...Intentaré darle una vuelta a este tema.
Para finalizar, he visto en este blog, que hay gente que reemplaza el fichero /etc/init.d/memcached por un con contenido similar a este:




#!/bin/bash
prog="memcached"
start() {
echo -n $"Starting $prog "
# Sessions cache.
memcached -m 16 -l 0.0.0.0 -p 11211 -d -u nobody
# Default cache.
memcached -m 32 -l 0.0.0.0 -p 11212 -d -u nobody
# Block cache.
memcached -m 32 -l 0.0.0.0 -p 11213 -d -u nobody
# Content cache. Holds fully loaded content type structures.
memcached -m 16 -l 0.0.0.0 -p 11214 -d -u nobody
# Filter cache. Usually the busiest cache after the default.
memcached -m 32 -l 0.0.0.0 -p 11215 -d -u nobody
# Form cache.
memcached -m 32 -l 0.0.0.0 -p 11216 -d -u nobody
# Menu cache.
memcached -m 32 -l 0.0.0.0 -p 11217 -d -u nobody
# Page cache. Bigger than most other caches.
memcached -m 128 -l 0.0.0.0 -p 11218 -d -u nobody
# Views definition cache.
memcached -m 1 -l 0.0.0.0 -p 11219 -d -u nobody
# Views data cache (may need to be increased if heavily used).
memcached -m 32 -l 0.0.0.0 -p 11220 -d -u nobody

# More caches that might be added later:
# Users table.
#/usr/bin/memcached -m 24 -l 0.0.0.0 -p 11219 -d -u nobody
# Path source cache.
#/usr/bin/memcached -m 4 -l 0.0.0.0 -p 11220 -d -u nobody
# Path destination cache.
#/usr/bin/memcached -m 6 -l 0.0.0.0 -p 11221 -d -u nobody
RETVAL=$?
echo
return $RETVAL
}

stop() {
if test "x`pidof memcached`" != x; then
echo -n $"Stopping $prog "
killall memcached
echo
fi
RETVAL=$?
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;

restart)
stop
start
;;
condrestart)
if test "x`pidof memcached`" != x; then
stop
start
fi
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart}"
exit 1
esac

¿Por que digo similar? Pues muy sencillo, basta con teclear:
memcached -h
y observar todos los parámetros de configuración que acepta en la línea de comandos. En mi opinión se debe tener especial cuidado a la hora de manejar la cantidad de memoria máxima a utilizar, el protocolo de escucha, el número máximo de conexiones simultáneas. 






[ Memcache funcionando en Drupal 6 ]


I'm back



He vuelto. Después de más de 1 mes sin aportar nada a este blog confirmo que sigo vivo. Por motivos de trabajo, asociación y personales apenas he tenido tiempo para escribir. Tengo varios apuntes que trasladar aquí, intentaré hacer lo más rápido posible.
Saludos y gracias por leerme!

lunes, 21 de febrero de 2011

Parsear XML con Python



Desde hace unas semanas estoy leyendo, estudiando y practicando Python. Es un lenguaje tan apasionante como interesante. En pocos días, me atrevería a decir que incluso horas, con unos conocimientos básicos de programación, puedes crear verdaderas maravillas pythonianas.
El caso es en la Asociación Comunidade O Zulo , hemos puesto en marcha un proyecto para customizar una distribución Ubuntu Linux y completarla con material multimedia. Para realización las aportaciones multimedia de este proyecto, todavía un embrión pero os adelanto que tiene muy buena pinta, hemos levantado un sitio web en Drupal dónde los usuarios podrán enviar las imágenes. [Explicación técnica que omito para no aburrir al personal] Para recuperar las imágenes estamos desarrollando un script en Python que lee el XML y vía SQLite completa un álbum en Shotwell. El script básico para parsear el XML es el siguiente:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# xml-parser-ozulo-0.0.1-dev.py
#
# Copyright 2011 Alberto Permuy Leal
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
import sys, urllib
from xml.etree import ElementTree as et


def main():
documento = et.parse(urllib.urlopen('http://www.comunidadeozulo.org/rss.xml')).getroot()
entradas = documento.getiterator('item')
for una_entrada in entradas:
elementos = una_entrada.getiterator()
for un_elemento in elementos:
if un_elemento.tag == 'title':
print un_elemento.text
return 0

if __name__ == '__main__':
main()

Es casi idéntico a esta entrada, salvo que he añadido el parse vía urllib.

martes, 8 de febrero de 2011

Validar formato IPv4 con bash

#!/bin/bash
test $(echo $1 | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$')
if [ $? == 0 ]; then
echo "Ip correcta"
else
echo "Ip no válida"
fi
A modo de minichuleta, dejo por aquí este sencillo script en bash para comprobar si el formato de una IPv4 que se pasa como parámetro al script es correcto o no.

lunes, 7 de febrero de 2011

Debian 6.0 ¡Cómo pasa el tiempo!



Recuerdo la primera vez que escuché hablar de Debian GNU/Linux. Un tal Carlos, me comentaba que no perdiese el tiempo con RedHat, mientras me "dejaba" tres CDs con Debian Potato 2.2 terminando el año 2000. Con sólo un año de experiencia en GNU/Linux, la primera vez que me puse a instalar Debian GNU/Linux creí conocer de cerca el infierno.

Recuerdo que en 2003 y cuando aún por aquel entonces usaba como distribución de escritorio SuSE Linux, un chico que realizaba las prácticas en la misma empresa que yo por aquel entonces, llegaba con 7CDs de Debian Woody. Luego llegarían Sarge, Etch, Lenny y ahora Squeeze.

Cada release de Debian GNU/Linux, a mi entender debe ser celebrada, como mínimo tanto como un título de cualquier equipo de fútbol o selección que se precie. Es un esfuerzo de miles de personas que trabajan por y para la comunidad. No voy a soltar ahora mismo la clásica chapa acerca del software libre y las bondades de Debian GNU/Linux. Mi particular celebración para esta versión 6.0 es citar los aspectos que me han resultado, cuando menos, curiosos en relación con otras versiones.

  • Han renovado el aspecto de www.debian.org. Todo hay que decir, que si bien la versión anterior y la actual no difieren mucho, esta última si está mejor estructurada y por lo menos, a primera vista, no parece que te encuentras preso de un flashback a los '90.
  • Debian Social. Impresionante el seguimiento desde Twitter e Identi.ca de todos los twitteros linuxeros. Para muestra, un botón.
  • ¿Ha sido la release menos mediática? Es posible, lo respeto pero no lo comparto. Leo en ZDNet que sí, que quizá el asentamiento de Ubuntu como distro más amigable a desplazado al ostracismo a Debian GNU/Linux. A lo mejor soy un bicho raro, pero cuando me hablan de Ubuntu, mis pensamientos siempre pasan o se dirigen a Debian GNU/Linux.
  • GNU/kFreeBSD. Es la primera release que tiene una versión sin un núcleo Linux. ¡ Muy buena noticia!
  • Núcleo Linux completamente libre. Cito directamente de Debian.org "Otra novedad es el núcleo de Linux completamente libre. En esta versión el núcleo ya no contiene archivos problemáticos de firmware. Estos se han dividido en paquetes separados y se han movido fuera del archivo principal de Debian al área no libre («non-free») del archivo, la cual no está activada de manera predeterminada".
Quizá no haya sido la versión más mediática, pero, estimados lectores, el reconocer el gran trabajo y enorme esfuerzo de la comunidad Debian para release de Squeeze, es cuando menos, digno de elogio. Por lo me que a mi respecta, como siempre que la decisión sobre el SSOO y arquitectura dependan de mi criterio: siempre Debian GNU/Linux.¡Enhorabuena a toda la comunidad!