En los títulos y los textos vais a encontrar unas cuantas citaciones cinematográficas (y si, soy un cinéfilo). Si no os interesan podéis fingir no verlas, ya que no son fundamentales para la comprensión de los post...

Este blog es la versión en Español de mi blog en Italiano L'arte della programmazione in C. Espero que mis traducciones sean comprensibles...

domingo, 18 de septiembre de 2016

El gran lighttpd
cómo escribir un módulo lighttpd en C - pt.1

Policía: ¿Y qué había en su maletín?
El Nota: Eh, papeles, solo papeles. Ya saben, solo mis papeles. Papeles del trabajo.
Policía: ¿Y a qué se dedica, señor?
El Nota: Estoy desempleado.
Vale, a menos que no os interese hacer el mismo trabajo del legendario El Nota (The Dude), es una buena idea tener un know-how valioso. Este es un post de alto valor añadido, y lo es simplemente considerando la ley de la oferta y la demanda: vamos a hablar de un tema que no dispone de una base de conocimientos amplia, entonces esto es un post valioso.
...me gustaría escribir un módulo, pero estoy un poco cansado...
Aquí ya habíamos visto hace tiempo (y os invito a releerlo) cómo escribir un módulo para Apache. Apache es un Web Server un súper popular (el más popular) y tiene una gran base de desarrolladores internos (Apache Software Foundation) y externos (profesionales y aficionados que escriben los más variados tipos de módulos). Gracias a esto se encuentra en la red una gran cantidad de documentación y guías, tanto oficiales (de nuevo la Apache Software Foundation) que no (sitios técnicos, bloggers como yo, etc.). Escribir un módulo Apache no es fácil, pero, con todo el apoyo disponible, no es una misión imposible.

Y llegamos a lighttpd: es un Web Server popular (pero mucho menos que Apache) y con características técnicas de primera clase: tiene un rendimiento comparable al de Apache, pero es mucho más ligero: poca carga de la CPU, bajo uso de memoria, etc. Prácticamente es un must para sistemas embeddeded o, más en general, para sistemas que necesitan alto rendimiento utilizando pocos recursos. Desafortunadamente lighttpd no tiene detrás una grande organización de desarrollo, y, en proporción a la menor popularidad, ni siquiera tiene un gran ejército de profesionales y aficionados que trabajan en ello. Gracias a esto NO se encuentra en la red una gran cantidad de documentación y guías, tanto oficiales que no. Escribir un módulo lighttpd no es fácil, y, con el escaso apoyo disponible, es una misión complicada.

En concreto: lighttpd es un gran producto escrito y mantenido por una pequeña comunidad de excelentes programadores, pero, al no tener detrás de una gran organización, se pierde un poco en los detalles: con más documentación y guías oficiales aumentaría la popularidad, lo que aumentaría también la comunidad de usuarios/desarrolladores (y por lo tanto la documentación no oficial), y, en definitiva, aumentaría el éxito del producto. Pero esto no pasa y entonces nos enfrentamos a un caso clásico de síndrome del perro que se muerde la cola.

lighttpd está en constante evolución, con rendimiento y fiabilidad en aumento, pero, por la falta de detalles mencionada antes, puede pasar que, entre una release y la otra, se olvide la retrocompatibilidad y se introduzcan cambios en la API de programación que invalidan muchos de los módulos (laboriosamente) escritos por desarrolladores externos (¡me pasó a mí con un módulo que escribí para la rel.1.4.33 y que con la rel.1.4.36 dejó de funcionar!).

Bueno, sin hablar más: vamos a escribir un módulo elemental para lighttpd, que será una buena base para escribir módulos más complejos (sobre los cuales os daré algunos consejos en futuros post). La primera actividad es, por supuesto, instalar lighttpd en el PC (y, si estaba instalado, quitar primero Apache). Buscando, con nuestro amigo Google, una de las muchas guías (como esta) para convertir un PC en un server LLMP (o WLMP) (no voy a describir el procedimiento para no alargar demasiado el discurso, pero, os lo garantizo, es bastante simple). Obviamente, al final del procedimiento hay que comprobar si el servidor Web funciona correctamente (por lo general las guías te dicen cómo hacerlo).

A continuación, hay que instalar lo necesario para desarrollar nuestro módulo. Las siguientes instrucciones son (por supuesto) para Linux. Para otros sistemas de la familia UNIX (BSD, OS X, etc.) el procedimiento se adapta de forma intuitiva, mientras que, por ese otro sistema que ni siquiera quiero mencionar (comienza en W...), lo siento pero tendréis que valeros vosotros mismos (si lo conoces lo evitas, y yo, os lo aseguro, lo conozco bien).

Entonces: descargaros de la Web oficial de lighttpd el tar de desarrollo correspondiente a la versión que acabais de instalar en el sistema (están disponibles también los tar de versiones anteriores a la última). Este tar sirve para crear en el sistema un entorno adecuado para el desarrollo y la instalación de nuevos módulos. Descomprimid (donde quieran) el tar, entren en la directory creada y intentad compilar e instalar la release (lo sé, es la misma versión que acabáis de instalar el sistema, pero este paso sirve para determinar si el sistema de desarrollo funciona correctamente). Suponiendo de utilizar la versión 1.4.33 escribiremos:
    tar zxvf lighttpd-1.4.33.tar.gz
    cd lighttpd-1.4.33
    ./autogen.sh
    ./configure
    make
    sudo make install
    sudo /etc/init.d/lighttpd restart
Comprueben si el Web Server sigue funcionando (de la misma manera utilizada en la primera instalación) y, si todo está bien, estamos listos para escribir/compilar/instalar el nuestro nuevo módulo. Pero esto lo veremos en el próximo episodio...

¡Hasta el próximo post!