Instalación de módulos de terceros#

Además de nuestros propios módulos dinámicos para Angie y Angie PRO, recopilamos y publicamos paquetes para varios módulos populares de terceros compatibles con nginx, desarrollados fuera de nuestra empresa, en nuestro repositorio.

Instalación y configuración#

Los paquetes de módulos de terceros se instalan desde nuestro repositorio igual que nuestros propios paquetes:

Para usar el módulo instalado en la configuración, cárgalo usando la directiva load_module en el contexto main:

load_module modules/<module_name>.so;

Truco

Los nombres de los paquetes y los propios módulos en la configuración tienen los siguientes prefijos:

  • Angie: angie-module-<name>

  • Angie PRO: angie-pro-module-<name>

Nota

No revisamos el código fuente de estos módulos y no somos responsables de las consecuencias de su instalación; los paquetes se compilan basándose en numerosas solicitudes exclusivamente para la comodidad del usuario.

Lista de paquetes#

Módulo

Versión

Paquetes

Auth JWT

0.15.0

angie-module-auth-jwt
angie-pro-module-auth-jwt

Auth LDAP

241200e

angie-module-auth-ldap
angie-pro-module-auth-ldap

Auth PAM

v1.5.5

angie-module-auth-pam
angie-pro-module-auth-pam

Auth SPNEGO

v1.1.3

angie-module-auth-spnego
angie-pro-module-auth-spnego

Auth TOTP

1.2.0

angie-module-auth-totp
angie-pro-module-auth-totp

Brotli

v1.0.0rc

angie-module-brotli
angie-pro-module-brotli

Cache Purge

3.0.4

angie-module-cache-purge
angie-pro-module-cache-purge

CGI

v0.15.2

angie-module-cgi
angie-pro-module-cgi

Combined Upstreams

2.3.1

angie-module-combined-upstreams
angie-pro-module-combined-upstreams

DAV Ext

v4.0.1

angie-module-dav-ext
angie-pro-module-dav-ext

Dynamic Limit Req

1.9.3

angie-module-dynamic-limit-req
angie-pro-module-dynamic-limit-req

Echo

v0.65

angie-module-echo
angie-pro-module-echo

Enhanced Memcached

v0.3

angie-module-enhanced-memcached
angie-pro-module-enhanced-memcached

Eval

2016.06.10

angie-module-eval
angie-pro-module-eval

GeoIP2

3.4

angie-module-geoip2
angie-pro-module-geoip2

Headers More

v0.40

angie-module-headers-more
angie-pro-module-headers-more

HTTP Auth RADIUS

458af16

angie-module-http-auth-radius
angie-pro-module-http-auth-radius

JWT

v3.4.6

angie-module-jwt
angie-pro-module-jwt

Keyval

0.5.0

angie-module-keyval
angie-pro-module-keyval

Lua: http_lua_module, stream_lua_module

0.10.31 / v0.0.17

angie-module-lua
angie-pro-module-lua

ModSecurity

v1.0.4

angie-module-modsecurity
angie-pro-module-modsecurity

NJS: http_js, stream_js

1.0.2

angie-module-njs
angie-pro-module-njs

NDK

v0.3.4

angie-module-ndk
angie-pro-module-ndk

OIDC

0.8.0

angie-module-oidc
angie-pro-module-oidc

OpenTracing

v0.50.0

angie-module-opentracing
angie-pro-module-opentracing

OpenTelemetry

v0.1.2

angie-module-otel
angie-pro-module-otel

PostgreSQL

1.0rc7

angie-module-postgres
angie-pro-module-postgres

Redis2

v0.15

angie-module-redis2
angie-pro-module-redis2

RTMP

v1.2.2

angie-module-rtmp
angie-pro-module-rtmp

Set Misc

v0.34

angie-module-set-misc
angie-pro-module-set-misc

Subs

e12e965

angie-module-subs
angie-pro-module-subs

TestCookie

7d263d4

angie-module-testcookie
angie-pro-module-testcookie

UnBrotli

60bed63

angie-module-unbrotli
angie-pro-module-unbrotli

UnZstd

658990e

angie-module-unzstd
angie-pro-module-unzstd

Upload

2.3.0

angie-module-upload
angie-pro-module-upload

VOD

v1.10.1

angie-module-vod
angie-pro-module-vod

VTS: module-vts, module-sts, module-stream-sts

v0.2.7 / v0.1.1 / v0.1.1

angie-module-vts
angie-pro-module-vts

Weserv Images

v5.1.0

angie-module-weserv-images
angie-pro-module-weserv-images

ZIP

1.3.0

angie-module-zip
angie-pro-module-zip

Zstd

0.90.9

angie-module-zstd
angie-pro-module-zstd

Compilación de un módulo para la versión en paquetes de Angie o Angie PRO#

Si el módulo que necesitas no está en la lista, puedes compilarlo por tu cuenta para el Angie o el Angie PRO que instalaste desde nuestros paquetes. Angie y Angie PRO cargan un módulo dinámico solo si se compiló:

  • para el mismo producto, Angie o Angie PRO;

  • para exactamente la misma versión;

  • con opciones de compilación que coincidan.

Nuestros paquetes se compilan sin la opción --with-compat, por lo que el Angie y el Angie PRO instalados desde ellos rechazan un módulo compilado con las opciones por defecto de ./configure o con --with-compat. El procedimiento siguiente compila un módulo que el Angie o el Angie PRO instalados desde paquetes sí cargan. No recompilas ni sustituyes Angie ni Angie PRO: el paquete sigue instalado, y el módulo se compila por separado y se carga en él. El módulo se compila en el árbol de código fuente de Angie de la misma versión que el paquete instalado, con las opciones de compilación de ese paquete. Angie PRO se distribuye solo como paquetes binarios, sin código fuente, pero usa el mismo sistema de compilación que Angie. Para compilar un módulo para Angie PRO, usas el mismo árbol de código fuente de Angie con los archivos de cabecera y la configuración de compilación de Angie PRO del paquete angie-pro-headers.

Los pasos usan como ejemplo ngx-fancyindex: un módulo elegido arbitrariamente que no está en nuestra lista. Otros módulos siguen los mismos pasos, con su propia dirección de repositorio y sus propios nombres de módulo, además de las bibliotecas o los módulos que exijan sus propias instrucciones de compilación.

No revisamos el código de los módulos compilados de este modo y no somos responsables de las consecuencias de cargarlos.

  1. Instala el compilador, las bibliotecas con las que se compila Angie y las herramientas para obtener el código fuente. En Debian y Ubuntu:

    $ sudo apt install build-essential libpcre2-dev zlib1g-dev libssl-dev libcrypt-dev curl git
    

    En RHEL, Fedora y derivados, instala además redhat-rpm-config, que aporta los ajustes del compilador con los que se compilan nuestros paquetes:

    $ sudo dnf install gcc make pcre2-devel zlib-devel openssl-devel libxcrypt-devel redhat-rpm-config git
    
  2. Solo para Angie PRO: instala angie-pro-headers de la misma versión que el paquete angie-pro instalado. El paquete angie-pro-headers instala los archivos de cabecera y la configuración de compilación de Angie PRO en /usr/include/angie-pro/. Procede del mismo repositorio que angie-pro, y su disponibilidad depende de tu licencia. No depende de angie-pro, así que el gestor de paquetes no hace coincidir sus versiones; indica la versión de forma explícita. En Debian y Ubuntu:

    $ sudo apt install "angie-pro-headers=$(dpkg-query -W -f='${Version}' angie-pro)"
    

    En RHEL, Fedora y derivados:

    $ sudo dnf install "angie-pro-headers-$(rpm -q --qf '%{VERSION}-%{RELEASE}' angie-pro)"
    
  3. Descarga y descomprime el código fuente de Angie de la versión instalada. Para Angie PRO, es el código fuente de Angie de la misma versión; los archivos de Angie PRO se le añaden en el paso 6. Angie PRO imprime su versión con el sufijo (PRO), que el primer comando elimina:

    $ VERSION=$(sudo angie -v 2>&1 | sed -n 's|^Angie version: Angie/\([0-9.]*\).*|\1|p')
    $ echo "$VERSION"
    
        1.12.4
    
    $ curl -fsSO "https://download.es.angie.software/files/angie-$VERSION.tar.gz"
    $ tar -xzf "angie-$VERSION.tar.gz"
    
  4. Clona el repositorio del módulo junto al árbol de código fuente de Angie; en el ejemplo, es ngx-fancyindex:

    $ git clone https://github.com/aperezdc/ngx-fancyindex
    
  5. Configura la compilación con las opciones del Angie o del Angie PRO instalados, añadiendo el módulo. En RHEL, Fedora y derivados, define antes los indicadores estándar del compilador de la distribución, con los que también se compilan nuestros paquetes pero que angie -V no muestra:

    $ export CFLAGS="$(rpm --eval '%{optflags}')"
    

    Después, en cualquier distribución, ejecuta:

    $ cd "angie-$VERSION"
    $ eval ./configure $(sudo angie -V 2>&1 | sed -n 's/^configure arguments: //p' | sed 's/ --with-license//') \
          --add-dynamic-module=../ngx-fancyindex
    

    eval hace que el shell respete las comillas de las opciones impresas, de modo que los valores con espacios no se dividan. El segundo sed elimina --with-license, con la que se compilan algunos paquetes de Angie PRO: el ./configure de Angie no conoce esta opción, y la opción afecta solo al ejecutable de Angie PRO, no al módulo. En Angie, las opciones no la contienen.

    Si ./configure falla, corrige la causa, por ejemplo instalando una biblioteca que falte, y elimina el directorio ../angie-feature-cache antes de ejecutarlo de nuevo: las opciones del paquete incluyen --feature-cache=../angie-feature-cache, por lo que ./configure guarda ahí las comprobaciones fallidas y en la siguiente ejecución las informa como using cached check ... not found.

    En RHEL, Fedora y derivados, los errores de un paso omitido no lo nombran: sin redhat-rpm-config, ./configure se detiene con the invalid value in --with-ld-opt="value", y sin el CFLAGS exportado, con C99 variadic macros support is not found.

  6. Solo para Angie PRO: sustituye los archivos de cabecera y la configuración de compilación del árbol de código fuente por los de Angie PRO:

    $ cp -r /usr/include/angie-pro/. src/
    $ cp src/objs/* objs/
    

    El paquete reproduce la estructura del directorio src, por lo que el primer comando sustituye los archivos de cabecera. El subdirectorio objs del paquete, ahora en src/objs, contiene la configuración de compilación de Angie PRO (ngx_auto_config.h y ngx_auto_headers.h); el segundo comando copia esos archivos en el directorio objs que creó ./configure. Hacen falta ambos comandos. Los archivos de cabecera dan al módulo las estructuras y la firma del producto de Angie PRO. La configuración de compilación fija las opciones con las que se compila el módulo: Angie PRO tiene opciones que el ./configure de Angie no conoce, y un módulo compilado con la configuración de Angie no coincidiría con la disposición de las estructuras de Angie PRO.

  7. Compila el módulo:

    $ make modules
    

    El resultado es el archivo objs/ngx_http_fancyindex_module.so.

  8. Instala el módulo:

    $ sudo install -m 644 objs/ngx_http_fancyindex_module.so /etc/angie/modules/
    

Carga y actualización#

Tanto en Angie como en Angie PRO, carga el módulo con la directiva load_module en el contexto main y luego comprueba y recarga la configuración:

load_module modules/ngx_http_fancyindex_module.so;
$ sudo angie -t && sudo systemctl reload angie

Si el módulo no coincide con el Angie o el Angie PRO instalado, angie -t falla con un mensaje que indica cuál es la discrepancia:

  • module "file" was built for "Angie" but you are running "Angie PRO", o lo mismo con los productos intercambiados — el módulo se compiló para el otro producto;

  • module "file" version module_version instead of angie_version — el módulo se compiló para otra versión; cada versión se imprime como un único número entero, en el que la versión menor y el número de parche se completan con ceros a la izquierda hasta tres dígitos;

  • module "file" is not binary compatible — el módulo se compiló con otras opciones de compilación.

Cada nueva versión de Angie o Angie PRO exige recompilar el módulo: rechaza una compilación para la versión anterior con el error de versión. Si el servicio está en ejecución cuando el paquete se actualiza a una versión nueva, el paquete intenta pasarlo en vivo al nuevo ejecutable. Con el módulo compilado para la versión anterior, el nuevo ejecutable rechaza la configuración, por lo que el cambio no se produce: el paquete imprime un mensaje Binary upgrade failed y el ejecutable anterior sigue atendiendo las solicitudes.

Tras la actualización, recompila y reinstala el módulo, reutilizando su código fuente de la primera compilación: repite los pasos 3 y del 5 al 8, empezando en el directorio donde ejecutaste el paso 3 la primera vez; para Angie PRO, repite antes el paso 2. El último paso usa install y no cp, porque install escribe un archivo nuevo en lugar de sobrescribir el que el servicio en ejecución ya ha cargado. Después reinicia el servicio para que el nuevo ejecutable arranque con el módulo recompilado:

$ sudo angie -t && sudo systemctl restart angie

Aquí no basta con recargar: la recarga se completa con éxito, pero el ejecutable que está en marcha sigue usando la compilación del módulo que ya ha cargado. Para cambiar al nuevo ejecutable y al módulo recompilado sin interrumpir el servicio, usa una actualización del ejecutable en vivo en lugar de un reinicio.