Instalação de módulos de terceiros#

Além dos nossos próprios módulos dinâmicos para Angie e Angie PRO, coletamos e publicamos pacotes para uma série de módulos populares de terceiros compatíveis com nginx, desenvolvidos fora da nossa empresa, em nosso repositório.

Instalação e configuração#

Os pacotes de módulos de terceiros são instalados do nosso repositório assim como nossos próprios pacotes:

Para usar o módulo instalado na configuração, carregue-o usando a diretiva load_module no contexto main:

load_module modules/<module_name>.so;

Dica

Os nomes dos pacotes e os próprios módulos na configuração têm os seguintes prefixos:

  • Angie: angie-module-<name>

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

Nota

Não revisamos o código-fonte desses módulos e não somos responsáveis pelas consequências de sua instalação; os pacotes são compilados com base em numerosas solicitações exclusivamente para conveniência do usuário.

Lista de pacotes#

Módulo

Versão

Pacotes

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

Compilação de um módulo para a versão em pacotes do Angie ou do Angie PRO#

Se o módulo de que você precisa não estiver na lista, você pode compilá-lo por conta própria para o Angie ou o Angie PRO instalado a partir de nossos pacotes. O Angie e o Angie PRO só carregam um módulo dinâmico se ele tiver sido compilado:

  • para o mesmo produto, Angie ou Angie PRO;

  • para exatamente a mesma versão;

  • com opções de compilação correspondentes.

Nossos pacotes são compilados sem a opção --with-compat, por isso o Angie e o Angie PRO instalados a partir deles rejeitam um módulo compilado com as opções padrão do ./configure ou com --with-compat. O procedimento abaixo compila um módulo que o Angie ou o Angie PRO instalado a partir de pacotes carrega. Você não recompila nem substitui o próprio Angie ou Angie PRO: o pacote continua instalado, e o módulo é compilado separadamente e carregado nele. O módulo é compilado na árvore de código-fonte do Angie da mesma versão do pacote instalado, com as opções de compilação desse pacote. O Angie PRO é distribuído apenas em pacotes binários, sem código-fonte, mas usa o mesmo sistema de compilação do Angie. Para compilar um módulo para o Angie PRO, você usa a mesma árvore de código-fonte do Angie com os arquivos de cabeçalho e a configuração de compilação do Angie PRO do pacote angie-pro-headers.

Os passos usam o ngx-fancyindex como exemplo: um módulo escolhido arbitrariamente que não está em nossa lista. Outros módulos seguem os mesmos passos, com o endereço do repositório e os nomes de módulo próprios, além das bibliotecas ou módulos que as instruções de compilação deles exigirem.

Não revisamos o código dos módulos compilados dessa forma e não somos responsáveis pelas consequências de carregá-los.

  1. Instale o compilador, as bibliotecas com as quais o Angie é compilado e as ferramentas para obter o código-fonte. No Debian e Ubuntu:

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

    No RHEL, Fedora e derivados, instale também o redhat-rpm-config, que fornece as configurações do compilador com as quais nossos pacotes são compilados:

    $ sudo dnf install gcc make pcre2-devel zlib-devel openssl-devel libxcrypt-devel redhat-rpm-config git
    
  2. Somente para o Angie PRO: instale o angie-pro-headers na mesma versão do pacote angie-pro instalado. O pacote angie-pro-headers instala os arquivos de cabeçalho e a configuração de compilação do Angie PRO em /usr/include/angie-pro/. Ele vem do mesmo repositório do angie-pro, e sua disponibilidade depende da licença. Ele não depende do angie-pro, portanto o gerenciador de pacotes não faz as versões coincidirem; especifique a versão explicitamente. No Debian e Ubuntu:

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

    No RHEL, Fedora e derivados:

    $ sudo dnf install "angie-pro-headers-$(rpm -q --qf '%{VERSION}-%{RELEASE}' angie-pro)"
    
  3. Baixe e descompacte o código-fonte do Angie da versão instalada. No caso do Angie PRO, é o código-fonte do Angie da mesma versão; os arquivos do Angie PRO são adicionados a ele no passo 6. O Angie PRO imprime a versão com o sufixo (PRO), que o primeiro comando descarta:

    $ 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.pt.angie.software/files/angie-$VERSION.tar.gz"
    $ tar -xzf "angie-$VERSION.tar.gz"
    
  4. Clone o repositório do módulo ao lado da árvore de código-fonte do Angie; no exemplo, é o ngx-fancyindex:

    $ git clone https://github.com/aperezdc/ngx-fancyindex
    
  5. Configure a compilação com as opções do Angie ou do Angie PRO instalado, adicionando o módulo. No RHEL, Fedora e derivados, defina antes as flags padrão do compilador da distribuição, com as quais nossos pacotes também são compilados, mas que angie -V não mostra:

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

    Depois, em qualquer distribuição, execute:

    $ 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
    

    O eval faz o shell respeitar as aspas nas opções impressas, de modo que valores com espaços não sejam divididos. O segundo sed remove --with-license, com o qual alguns pacotes do Angie PRO são compilados: o ./configure do Angie não conhece essa opção, e ela afeta apenas o executável do Angie PRO, não o módulo. No Angie, as opções não a contêm.

    Se o ./configure falhar, corrija a causa (por exemplo, instalando uma biblioteca ausente) e remova o diretório ../angie-feature-cache antes de executá-lo novamente: as opções do pacote incluem --feature-cache=../angie-feature-cache, por isso o ./configure salva ali as verificações que falharam e as relata na próxima execução como using cached check ... not found.

    No RHEL, Fedora e derivados, quando um passo é omitido, a mensagem de erro não diz qual foi: sem o redhat-rpm-config, o ./configure termina com the invalid value in --with-ld-opt="value" e, sem o CFLAGS exportado, com C99 variadic macros support is not found.

  6. Somente para o Angie PRO: substitua os arquivos de cabeçalho e a configuração de compilação da árvore de código-fonte pelos do Angie PRO:

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

    O pacote reproduz a estrutura do diretório src, por isso o primeiro comando substitui os arquivos de cabeçalho. O subdiretório objs do pacote, agora em src/objs, contém a configuração de compilação do Angie PRO (ngx_auto_config.h e ngx_auto_headers.h); o segundo comando copia esses arquivos para o diretório objs que o ./configure criou. Os dois comandos são necessários. Os arquivos de cabeçalho dão ao módulo as estruturas e a assinatura de produto do Angie PRO. A configuração de compilação define as opções com as quais o módulo é compilado: o Angie PRO tem opções que o ./configure do Angie não conhece, e um módulo compilado com a configuração do Angie não corresponderia ao layout das estruturas do Angie PRO.

  7. Compile o módulo:

    $ make modules
    

    O resultado é o arquivo objs/ngx_http_fancyindex_module.so.

  8. Instale o módulo:

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

Carregamento e atualização#

Tanto no Angie quanto no Angie PRO, carregue o módulo com a diretiva load_module no contexto main e depois verifique e recarregue a configuração:

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

Se o módulo não corresponder ao Angie ou ao Angie PRO instalado, o angie -t falha com uma mensagem que indica a incompatibilidade:

  • module "file" was built for "Angie" but you are running "Angie PRO" ou a mesma mensagem com os produtos trocados — o módulo foi compilado para o outro produto;

  • module "file" version module_version instead of angie_version — o módulo foi compilado para outra versão; cada versão é impressa como um único número inteiro, com a versão secundária e o número do patch preenchidos com zeros à esquerda até três dígitos;

  • module "file" is not binary compatible — o módulo foi compilado com outras opções de compilação.

Cada nova versão do Angie ou do Angie PRO exige recompilar o módulo: ela rejeita o módulo compilado para a versão anterior, com o erro de versão. Se o serviço estiver em execução quando o pacote for atualizado para uma nova versão, o pacote tenta passar o serviço, em tempo real, para o novo executável. Com o módulo compilado para a versão anterior, o novo executável rejeita a configuração, e por isso a troca não ocorre: o pacote imprime a mensagem Binary upgrade failed, e o executável anterior continua atendendo.

Depois da atualização, recompile e reinstale o módulo, reaproveitando o código-fonte da primeira compilação: repita os passos 3 e 5 a 8, começando no diretório em que você executou o passo 3 na primeira compilação; para o Angie PRO, repita antes o passo 2. O último passo usa install, e não cp, porque o install grava um arquivo novo em vez de sobrescrever o que o serviço em execução carregou. Depois, reinicie o serviço para que o novo executável inicie com o módulo recompilado:

$ sudo angie -t && sudo systemctl restart angie

Aqui, um recarregamento não basta: ele é bem-sucedido, mas o executável em execução continua usando a compilação do módulo que já carregou. Para passar ao novo executável e ao módulo recompilado sem interromper o serviço, use uma atualização de executável em tempo real em vez de reiniciar.