Como compilar un modulo dinámico para NGINX

En esta entrada vamos a compilar un modulo dinámico para usarlo en una instalación que tengamos de Nginx, nuestra configuración esta basada en Ubuntu 18.04 y la versión de Nginx será la 1.14.0 (la que viene en los repositorios oficiales de Ubuntu).

Para empezar, crearemos un directorio donde pondremos todo el codigo fuente:

mkdir /build
cd /build

Seguidamente, actualizamos el sistema e instalamos las dependencias necesarias para la compilación.

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential git tree dpkg-dev perl libperl-dev libgd3 libgd-dev \
          libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev

Ahora vamos a obtener el código fuente de Nginx, en nuestro caso, y para evitar problemas de compatibilidad entre versiones, vamos a usar el código fuente que suministra Ubuntu.
También podríamos compilar el código suministrado por nginx, para ello tendríamos que obtener los ‘flags’ para el compilador que usan los desarrolladores de Ubuntu al compilar Nginx para el paquete que suministran en sus repositorios.
Con el código suministrado por Ubuntu nos podemos centrar en añadir solo la parte de nuestro modulo en la configuración.

# Descomentamos las lineas que nos permiten descargar el código fuente
sed -i '/^#.* deb-src /s/^#//' /etc/apt/sources.list

# Descargamos fuente
sudo apt source nginx

# Instalamos dependencias que nos falten
sudo apt-get build-dep nginx

Con esto tendremos en nuestro directorio /build otro con el código fuente de Nginx, en nuestro caso /build/nginx-1.14.0

Ahora descargamos el código fuente del modulo que queremos compilar. En nuestro caso vamos a compilar el modulo nginx-ct, que nos va a proporcionar una extensión TLS para cumplir con el Certificate Transparency de Google.

wget -O nginx-ct.zip https://github.com/grahamedgecombe/nginx-ct/archive/master.zip
unzip nginx-ct.zip

Una vez hecho esto, nuestro arbol de directorios quedara asi:

build
|
├───nginx-ct-master
└───nginx-1.14.0

El siguiente paso es modificar el archivo donde se configuran los módulos con los que queremos compilar nuestro nginx, para ello debemos editar el fichero rules dentro del directorio debian

cd /build/nginx-1.14.0/debian

vim rules

Una vez dentro del fichero, buscamos la cadena full_configure_flags := \ y añadimos nuestro modulo en la cadena:

full_configure_flags := \
                        $(common_configure_flags) \
                        --with-http_addition_module \
                        --with-http_dav_module \
                        --with-http_geoip_module \
                        --with-http_gzip_static_module \
                        --with-http_image_filter_module \
                        --with-http_spdy_module \
                        --with-http_sub_module \
                        --with-http_xslt_module \
                        --with-mail \
                        --with-mail_ssl_module \
                        --add-module=$(MODULESDIR)/nginx-auth-pam \
                        --add-module=$(MODULESDIR)/nginx-dav-ext-module \
                        --add-module=$(MODULESDIR)/nginx-echo \
                        --add-module=$(MODULESDIR)/nginx-upstream-fair \
                        --add-module=$(MODULESDIR)/ngx_http_substitutions_filter_module \     # <-- Nos aseguramos de añadir la \ al final
                        --add-dynamic-module=/build/nginx-ct-master       # <-- Añadimos esta linea al final de la cadena

Ahora ya lo tenemos todo listo para empezar a compilar nuestro módulo.

# Nos ponemos en el directorio de nginx
cd /build/nginx-1.14.0

# Empezamos a contruir nuestro paquete
sudo dpkg-buildpackage -b

Falta el final.