Módulos en Apache 2

¿Qué son los módulos?

Un módulo es una parte independiente de un programa. La mayor parte de la funcionalidad de Apache está contenida en módulos que pueden incluirse o excluirse. Los módulos que se compilan con el binario httpd se llaman módulos estáticos, mientras que los que se almacenan de forma separada y pueden ser cargados de forma opcional, se denominan módulos dinámicos (también llamados Objetos Dinámicos Compartidos, DSO). Los módulos que están incluidos por defecto se llaman módulos base. También hay otros módulos que no se incluyen de forma predeterminada, llamados módulos de terceros.

Soporte de Objetos Dinámicos Compartidos

El servidor HTTP Apache es un programa modular en el que el administrador puede elegir qué funcionalidades se incluyen mediante la selección de un conjuno de módulos. En primer lugar, los módulos pueden compilarse de manera estática en el binario httpd. De forma alternativa los módulos también pueden compilarse como Objectos Dinámicos Compartidos (DSO’s) que existen de forma independiente del archivo binario httpd. Los módulos que se deseen usar como objetos dinámicos compartidos pueden compilarse al mismo tiempo que el servidor, o pueden compilarse en otro momento y ser añadidos después usando la Herramienta de Extensión de Apache (apxs).

Cargar módulos de Apache individualmente como objetos dinámicos compartidos (DSO) es posible gracias a un módulo llamado mod_so, que debe compilarse estáticamente en el núcleo (kernel) de Apache. Es el único módulo que, junto a core, no se puede usar como objeto dinámico compartido. Prácticamente, todos los demás módulos distribuidos con Apache se pueden usar como objetos dinámicos compartidos individualmente, siempre y cuando se haya activado la posibilidad de usarlos con la opción de configure—enable-module=shared. Una vez que haya compilado un módulo como objeto dinámico compartido y le haya puesto un nombre del tipo mod.so, puede cargarlo al iniciar o reiniciar el servidor usando la directiva LoadModule de mod_so en el fichero httpd.conf.

Para simplificar la creación de objetos dinámicos compartidos para Apache (especialmente módulos de terceras partes) está disponible un nuevo programa de soporte llamado apxs (APache eXtenSion). Puede usar este programa para crear módulos como objetos dinámicos compartidos sin tener que crearlos al mismo tiempo que compila su servidor Apache. La idea es simple: cuando se instala Apache, el procedimiento make install instala los ficheros de cabecera de C de Apache y especifica las opciones de compilación y enlace dependientes de la plataforma para generar objetos dinámicos compartidos con apxs. De esta manera, el usuario puede usar apxs para compilar el código fuente de módulos de Apache de manera independiente, y sin tener que preocuparse por las opciones de compilación y enlace dependientes de la plataforma que soportan objetos dinámicos compartidos.

Ventajas e inconvenientes

La utilización de los Objetos Dinámicos Compartidos tiene sus ventajas e inconvenientes. El administrador de Apache debe evaluar tanto unas como otras, y así poder decidir correctamente a la hora de usar los Objetos Dinámicos Compartidos. A continuación se listan éstas ventajas e inconvenientes:

Ventajas Inconvenientes
El servidor es mucho más flexible en tiempo de ejecución porque pueden añadirse módulos mediante comandos de configuración LoadModule en httpd.conf en lugar de tener que hacerlo con las opciones de configure al compilar. Por ejemplo, de esta manera uno puede ejecutar diferentes instancias del servidor (estándar & SSL, mínima & super potente [mod_perl, PHP3], etc.) con una única instalación de Apache El mecanismo DSO no puede ser usado en todas las plataformas porque no todos los sistemas operativos soportan la carga dinámica de código en el espacio de direcciones de memoria de un programa
El servidor puede ser extendido fácilmente con módulos de terceras partes después de la instalación. Esto es un gran beneficio al menos para los mantenedores de paquetes de distribuciones, que pueden crear un paquete básico de Apache y paquetes adicionales que contengan extensiones tales como PHP3, mod_perl, mod_fastcgi, etc El servidor es aproximadamente un 20% más lento iniciándose por la sobrecarga que implica la resolución de símbolos por parte del cargador de Unix
Facilita la labor de hacer prototipos de módulos de Apache porque con el dúo DSO/apxs se puede trabajar fuera de la estructura de directorios de Apache, siendo únicamente necesario el comando apxs -i seguido del comando apachectl restart para probar la nueva versión del módulo que se está desarrollando El servidor es aproximadamente un 5% más lento ejecutándose en algunas plataformas porque el código posicionado independientemente (PIC) necesita algunas veces procesos bastante complicados para calcular direcciones relativas que no son en principio tan rápidos como los que se usan para calcular direcciones absolutas
Como los módulos DSO no pueden enlazarse a otras librerías basadas en DSO (ld -lfoo) en todas las plataformas (por ejemplo en las plataformas basadas en a.out normalmente no puede ser usada esta funcionalidad, mientras que sí puede ser usada en las plataformas basadas en ELF) no se puede usar el mecanismo DSO para todos los tipos de módulos. En otras palabras, los módulos compilados como ficheros DSO solamente pueden usar símbolos del núcleo (kernel) de Apache, los de las librerías de C (libc) y de todas las demas librerías dinámicas o estáticas usadas por el núcleo de Apache, o de archivos de librerías estáticas (libfoo.a) que contengan código independiente de su posición. Las únicas posibilidades para usar otro código es asegurarse de que el núcleo de Apache contiene una referencia a él o cargar el código por medio de dlopen()

APXS. APache eXtenSion tool

APXS es una herramienta para construir e instalar módulos para el servidor HTTP de Apache. Esto se lleva a cabo mediante la construcción de Objetos Dinámicos Compartidos (DSO) desde uno o más archivos fuente y objetos files, los cuales pueden ser cargados dentro del servidor Apache en tiempo de ejecución usando la directiva LoadModule desde mod_so.

Por lo tanto, para usar este mecanismo de extensión, la plataforma que se esté utilizando debe soportar la característica DSO, así como que el binario httpd de Apache esté compilado con el módulo mod_so. La herramienta APXS notifica automáticamente si la plataforma en la que se está utilizando acepta esta configuración o no. No obstante, se puede comprobar manualmente utilizando el siguiente comando:

$ httpd –l

Los argumentos files pueden ser cualquier archivo fuente C (.c), un archivo objeto (.o) o incluso un archivo de librería (.a). APXS reconoce automáticamente estas extensiones, usando los archivos fuente C para la compilación y el resto para la fase de enlace. Pero cuando se usa tales objetos precompilados hay que estar seguro de que son compilados por un código de posición independiente (PIC), para estar disponibles para ser usados por un objeto compartido cargado dinámicamente. Para instancias con GCC siempre se debe usar –fpic

A continuación, se enumeran las distintas opciones que se pueden utilizar con APXS:

-n modname. Establece explícitamente el nombre del módulo para las opciones -i (install) y –g (template generation). Para la opción -g su uso es requerido, mientras que para la opción –i la herramienta APXS intenta determinar el nombre desde la fuente, o al menos adivinarlo desde el nombre de archivo.

-q. Se usa para determinar la configuración de APXS. Los parámetros de consulta pueden se uno o más de los siguientes: CC, CFLAGS, CFLAGS_SHLIB, INCLUDEDIR, LD_SHLIB, LDFLAGS_SHLIB, LIBEXECDIR, LIBS_SHLIB, SBINDIR, SYSCONFDIR, TARGET.

-S name=value. Esta opción cambia la configuración de APXS descrita anteriormente.

-g. Genera un subdirectorio de nombre name (ver opción –n) , y en él dos archivos: un ejemplo de archivo fuente de módulo llamado mod_name.c, que puede ser usado como plantilla para crear módulos o como un inicio rápido para mostrar el mecanismo de APXS, y un MakeFile correspondiente para facilitar la construcción e instalación de este módulo.

-c. Indica la operación de compilación. Primero compila los archivos fuente C (.c) dentro de los correspondientes archivos objeto (.o), para posteriormente construir un objeto dinámico compartido en dsofile mediante el enlace de estos archivos objeto más los restantes archivos objeto (.o y .a) de files Si la opción –o no está especificada, el archivo de salida se averigua desde el primer nombre de archivo en files, siendo por defecto mod_name.so.

-o dsofile. Especifica explícitamente el nombre de archivo del objeto dinámico compartido. Si esta opción no se especifica y el nombre no puede averiguarse desde la lista files, el nombre reservado mod_unknown.so es utilizado.

-D name=value. Esta opción se pasa directamente a través del comando o comandos de compilación.

-I incdir. Se usa para añadir los directorios de búsqueda al proceso de construcción.

-L libdir. Esta opción se pasa directamente al comando de enlace. Se usa para añadir al proceso de construcción los directorios de librería donde buscar.

-l libname. Se usa para añadir las librerías al proceso de construcción.

-Wc,compiler-flags. Esta opción pasa marcas de compilador como marcas adicionales al comando compilador. Se usa para añadir opciones específicas de compilador.

-Wl,linker-flags. Esta opción pasa marcas de linker (enlazador) como marcas adicionales al comando enlazador. Se usa para añadir opciones específicas de enlazador.

-i. Indica la operación de instalación e instala uno o más objetos dinámicos compartidos dentro del directorio de módulos del servidor.

-a. Activa el módulo mediante la adición automática de una línea LoadModule correspondiente al archivo de configuración de Apache httpd.conf, o activándolo si ya existe.

-A. Igual que la opción –a pero añadiendo el prefijo # a la directiva LoadModule. Esto prepara el módulo para una activación posterior, al estar inicialmente desactivada.

-e. Indica la operación de edición que puede ser usada con las opciones –a y –A equivalente a la operación -i para editar el archivo de configuración de Apache httpd.conf sin intentar instalar el módulo.

Ejemplos

Supón que tienes un módulo de Apache llamado mod_foo.c con el que puedes extender la funcionalidad del servidor Apache. Para llevar a cabo esto, primero debes compilar las fuentes (.c) dentro de un objeto compartido apropiado para cargarlo en el servidor en tiempo de ejecución, usando el siguiente comando:

$ apxs -c mod_foo.c
gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c
ld -Bshareable -o mod_foo.so mod_foo.o
$ _

Entonces debes actualizar la configuración de Apache, asegurándote de que una directiva LoadModule está presente para cargar este objeto compartido. Para simplificar este paso, APXS provee una forma automática para instalar el objeto compartido en su directorio de módulos y actualizar el archivo httpd.conf de manera acorde. Esto se puede lograr ejecutando lo siguiente:

$ apxs -i -a mod_foo.c
cp mod_foo.so /path/to/apache/modules/mod_foo.so
chmod 755 /path/to/apache/modules/mod_foo.so
[activating module 'foo' in /path/to/apache/etc/httpd.conf]
$

Esto añade la línea LoadModule foo_module modules/mod_foo.so al archivo de configuración si aún no está presente. Si quieres tener esta directiva desactivada por defecto debes usar la opción –A

$ apxs -i -A mod_foo.c

Para una comprobación rápida del mecanismo de APXS, puedes crear una plantilla de módulo más un Makefile correspondiente:

$ apxs -g -n foo
Creating [DIR] foo
Creating [FILE] foo/Makefile
Creating [FILE] foo/mod_foo.c
$

Entonces puedes compilar inmediatamente este módulo de ejemplo dentro de un objeto compartido y cargarlo dentro del servidor Apache:

$ cd foo
$ make all reload
apxs -c mod_foo.c
gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c
ld -Bshareable -o mod_foo.so mod_foo.o
apxs -i -a -n "foo" mod_foo.so
cp mod_foo.so /path/to/apache/modules/mod_foo.so
chmod 755 /path/to/apache/modules/mod_foo.so
[activating module 'foo' in /path/to/apache/etc/httpd.conf]
apachectl restart
/path/to/apache/sbin/apachectl restart: httpd not running, trying to start
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
/path/to/apache/sbin/apachectl restart: httpd started
$

Se puede incluso usar APXS para compilar módulos complejos, como puede ser PHP3:

$ cd php3
$ ./configure —with-shared-apache=../apache-1.3
$ apxs -c -o libphp3.so mod_php3.c libmodphp3-so.a
gcc -fpic -DSHARED_MODULE -I/tmp/apache/include -c mod_php3.c
ld -Bshareable -o libphp3.so mod_php3.o libmodphp3-so.a
$

APXS reconoce automáticamente los archivos fuente C y archivos objeto. Sólo los archivos fuente C son compilados mientras los archivos objeto restantes son usados en la fase de enlace.

« Apache 2

Si no se indica lo contrario, el contenido de esta página se ofrece bajo Creative Commons Attribution-ShareAlike 3.0 License