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...

miércoles, 21 de noviembre de 2012

El último Apache II - El regreso
cómo escribir un módulo Apache en C - pt.2

Ok, lo admito, el título es preocupante, ya que se parece mucho a esto, pero, al ser la segunda parte de un discurso abierto, no se me ha ocurrido nada mejor. Tal vez me estoy haciendo viejo. Y si en un futuro post me plagio a mi mismo en el texto (así como en el título) avisadme, así cierro el blog antes de que sea demasiado tarde.

Sin embargo, como prometí, hoy voy a explicar cómo escribir, instalar y probar un módulo de Apache elemental. Así que si a alguien le apasiona el argumento, con esta base (¡que funciona!), podrá divertirse en escribir otros más complejos en la cara de aquellos que dicen "C no sirve para el desarrollo Web".

Nuestro modulo básico lo llamaremos, por ejemplo, myapmod. Vamos a empezar con el código, por supuesto:
#include <httpd.h>
#include <http_protocol.h>
#include <http_config.h>

// handler del modulo
static int myapmodHandler(
    request_rec *reqrec)
{
    // test handler
    if (! reqrec->handler || strcmp(reqrec->handler, "myapmod"))
        return DECLINED;

    // test metodo http
    if (reqrec->method_number != M_GET)
        return HTTP_METHOD_NOT_ALLOWED;

    // html output
    ap_set_content_type(reqrec, "text/html;charset=ascii");
    ap_rputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n", 
                        reqrec);
    ap_rputs("<html>",  reqrec);
    ap_rputs("<head>",  reqrec);
    ap_rputs("<title>Modulo Apache Elementare</title>", reqrec);
    ap_rputs("</head>", reqrec);
    ap_rputs("<body>",  reqrec);
    ap_rputs("<h1>myapmod: il mio Modulo Apache elementare</h1>", 
                        reqrec);
    ap_rputs("</body>", reqrec);
    ap_rputs("</html>", reqrec);

    // salgo con OK
    return OK;
}

// register hooks del modulo
static void myapmodHooks(
    apr_pool_t *pool)
{
    // set hook handler
    ap_hook_handler(myapmodHandler, NULL, NULL, APR_HOOK_MIDDLE);
}

// estructura global del modulo
module AP_MODULE_DECLARE_DATA myapmod_module = {
    STANDARD20_MODULE_STUFF,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    myapmodHooks
};
¿Sencillo no? Y he añadido los oportunos comentarios en el código (un poco concisos, debo admitir), así que ni siquiera tengo que explicar cómo funciona. Y, como podréis ver cuando lo uséis por primera vez, el código HTML contenido en este documento se muestra correctamente por el navegador (ohhh... milagro).

Ahora pasamos a la compilación e instalación. Para mayor comodidad y gusto personal propongo una guía para Linux, pero os aseguro que el módulo básico se puede hacer también (si de verdad queréis sufrir) en Windows.

El requisito previo es, por supuesto, tener Apache instalado en el sistema. Buscad, con nuestro amigo Google, una de las millones de guías para convertir tu ordenador en un servidor LAMP (o WAMP) (no voy a describir el procedimiento para no alargar demasiado el discurso, pero, os lo garantizo, es bastante simple). Una vez instalado el servidor Apache hay que asegurarse de que el sistema también está preparado para compilar módulos de Apache: debe estar disponible el paquete apache2-prefork-dev, así que, para verificarlo, ejecutad:
dpkg -l | grep apache2
Y, si en la lista de paquetes que se muestra allí no está el paquete indicado, instaladlo con:
sudo apt-get install apache2-prefork-dev
Y ahora, por fin, podemos compilar e instalar con:
sudo apxs2 -c mod_myapmod.c 
sudo apxs2 -i mod_myapmod.la
Luego, necesitamos crear y editar dos archivos nuevos en el directory /etc/apache2/mods-available. Creamos/abrimos el primero con:
sudo gedit /etc/apache2/mods-available/myapmod.load
y dentro escribimos:
LoadModule myapmod_module /usr/lib/apache2/modules/mod_myapmod.so
A continuación, creamos/abrimos el segundo con:
sudo gedit /etc/apache2/mods-available/myapmod.conf
y dentro escribimos:
<Location /myapmod>
SetHandler myapmod
</Location>
A este punto no nos queda nada más que habilitar nuestro nuevo módulo y reiniciar el servidor Apache (lo que hará que arranquen todos los módulos habilitados, incluido nuestro myapmod):
sudo a2enmod myapmod
sudo /etc/init.d/apache2 restart
Si todo se hace correctamente, navegando con un browser a la URL http://localhost/myapmod se mostrará el código HTML insertado en nuestro módulo. Y si no funciona, entonces probad todos los pasos desde el principio, asegurándoos de que no os habéis perdido algunos errores reportados por el sistema. Buena suerte... (Yo, por supuesto, he probado todo el procedimiento antes de publicar el post, y estoy seguro de que funciona).

Es evidente que con este post no pretendo reinventar la rueda, ya que, si buscais en Google cómo construir un módulo elemental de Apache, vais a descubrir que muchos otros han publicado mucho antes que yo guías similares. ¿Pero queréis compararlo con leer la misma cosa escrita por vuestro C-blogger favorito?

Hasta el próximo post. 

3 comentarios: