第三方模块安装#

除了我们自己为 Angie 和 Angie PRO 开发的动态模块外, 我们还在仓库中收集并发布了一些流行的 nginx 兼容第三方模块的软件包, 这些模块由我们公司之外的开发者开发。

安装和配置#

第三方模块软件包的安装方式与我们自己的软件包相同,都是从我们的仓库安装:

要在 配置 中使用已安装的模块, 请在 main 上下文中使用 load_module 指令加载它:

load_module modules/<module_name>.so;

小技巧

软件包名称和配置中的模块本身具有以下前缀:

  • Angie:angie-module-<name>

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

备注

我们不审查这些模块的源代码, 也不对安装它们的后果负责; 这些软件包的编译完全基于大量用户请求, 仅仅 为了用户的便利。

软件包列表#

模块

版本

软件包

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

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

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

为 Angie 或 Angie PRO 的软件包版本构建模块#

如果您需要的模块不在列表中,可以为通过我们的软件包安装的 Angie 或 Angie PRO 自行构建该模块。Angie 和 Angie PRO 只加载符合下列条件的动态模块:

  • 为同一产品(Angie 或 Angie PRO)构建;

  • 为完全相同的版本构建;

  • 构建选项相匹配。

我们的软件包在构建时不带 --with-compat 选项,因此通过软件包安装的 Angie 和 Angie PRO 会拒绝以默认的 ./configure 选项或 --with-compat 构建的模块。下面的步骤用于构建与软件包相匹配的模块。 您无需重新构建或替换 Angie 或 Angie PRO 本身:软件包保持已安装状态, 模块则单独构建并加载到其中。模块在与已安装软件包版本相同的 Angie 源代码树中构建, 并采用该软件包的构建选项。Angie PRO 仅以二进制软件包形式提供,不含源代码, 但它与 Angie 使用同一套构建系统。要为 Angie PRO 构建模块,请使用同一份 Angie 源代码树, 并配合 angie-pro-headers 软件包提供的 Angie PRO 头文件和构建配置。

这些步骤以 ngx-fancyindex 为例,这是一个随意选取的、不在我们列表中的模块。其他模块的步骤相同, 只需换成各自的仓库地址和模块名称,并按其自身的构建说明另行安装所需的库或模块。

对于以这种方式构建的模块,我们不审查其代码,也不对加载它们的后果负责。

  1. 安装编译器、构建 Angie 所用的库以及获取源代码的工具。在 Debian 和 Ubuntu 上:

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

    在 RHEL、Fedora 及其衍生版上,还需安装 redhat-rpm-config, 它提供了构建我们的软件包时所用的编译器设置:

    $ sudo dnf install gcc make pcre2-devel zlib-devel openssl-devel libxcrypt-devel redhat-rpm-config git
    
  2. 仅 Angie PRO:安装与已安装的 angie-pro 软件包版本相同的 angie-pro-headers。angie-pro-headers 软件包会把 Angie PRO 的头文件和构建配置 安装到 /usr/include/angie-pro/。它来自与 angie-pro 相同的仓库,是否可用取决于您的许可证。 它不依赖 angie-pro,因此软件包管理器不会匹配二者的版本,请明确指定版本。 在 Debian 和 Ubuntu 上:

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

    在 RHEL、Fedora 及其衍生版上:

    $ sudo dnf install "angie-pro-headers-$(rpm -q --qf '%{VERSION}-%{RELEASE}' angie-pro)"
    
  3. 下载并解压已安装版本的 Angie 源代码。对于 Angie PRO,这指的是同一版本的 Angie 源代码; Angie PRO 的文件会在第 6 步加入其中。Angie PRO 输出的版本带有 (PRO) 后缀, 第一条命令会将其去掉:

    $ VERSION=$(sudo angie -v 2>&1 | sed -n 's|^Angie version: Angie/\([0-9.]*\).*|\1|p')
    $ echo "$VERSION"
    
        1.12.3
    
    $ curl -fsSO "https://download.cn.angie.software/files/angie-$VERSION.tar.gz"
    $ tar -xzf "angie-$VERSION.tar.gz"
    
  4. 在与 Angie 源代码目录同级的位置克隆模块的仓库;示例中为 ngx-fancyindex:

    $ git clone https://github.com/aperezdc/ngx-fancyindex
    
  5. 使用已安装的 Angie 或 Angie PRO 的构建选项配置构建,并加入该模块。 在 RHEL、Fedora 及其衍生版上,请先设置发行版的标准编译器标志; 我们的软件包也是用这些标志构建的,但 angie -V 不会显示它们:

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

    然后,在任何发行版上执行:

    $ 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 让 shell 按引号解析输出的选项,因此带空格的值不会被拆开。 第二个 sed 会去掉 --with-license,部分 Angie PRO 软件包带有该选项: Angie 的 ./configure 不认识这个选项,而且它只影响 Angie PRO 的可执行文件, 不影响模块。对于 Angie,选项中不含它。

    如果 ./configure 失败,请先解决导致失败的问题(例如安装缺少的库), 并在再次运行之前删除 ../angie-feature-cache 目录:软件包的选项包含 --feature-cache=../angie-feature-cache, 因此 ./configure 会把失败的检查结果保存在该目录中, 并在下次运行时将它们报告为 using cached check ... not found。

    在 RHEL、Fedora 及其衍生版上,因跳过某个步骤而产生的错误不会指明该步骤: 没有 redhat-rpm-config 时,./configure 会停止并报告 the invalid value in --with-ld-opt="value"; 没有导出 CFLAGS 时,则报告 C99 variadic macros support is not found。

  6. 仅 Angie PRO:用 Angie PRO 的头文件和构建配置替换源代码树中的对应文件:

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

    软件包沿用 src 目录的布局,因此第一条命令会替换头文件。 软件包的 objs 子目录现位于 src/objs,其中存放 Angie PRO 的构建配置 (ngx_auto_config.h 和 ngx_auto_headers.h); 第二条命令把这些文件复制到 ./configure 所创建的 objs 目录中。 两条命令缺一不可。头文件为模块提供 Angie PRO 的结构和产品签名; 构建配置则决定编译模块所用的构建选项:Angie PRO 有 Angie 的 ./configure 不认识的选项,用 Angie 的配置编译的模块与 Angie PRO 的结构布局不会一致。

  7. 构建模块:

    $ make modules
    

    构建结果是 objs/ngx_http_fancyindex_module.so 文件。

  8. 安装模块:

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

加载与升级#

无论使用的是 Angie 还是 Angie PRO,都请用 load_module 指令 在 main 上下文中加载模块,然后检查配置并重新加载:

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

如果模块与已安装的 Angie 或 Angie PRO 不匹配,angie -t 会失败, 并给出指明不匹配情况的消息:

  • module "file" was built for "Angie" but you are running "Angie PRO" 或产品名称互换后的同样消息,表示模块是为另一个产品构建的;

  • module "file" version module_version instead of angie_version, 表示模块是为另一个版本构建的;每个版本都以一个整数输出, 其中次版本号和补丁号用零补足到三位数;

  • module "file" is not binary compatible, 表示模块是用不同的构建选项构建的。

Angie 或 Angie PRO 的每个新版本都需要重新构建模块:新版本会拒绝为前一版本构建的模块, 并报告版本错误。如果在将软件包升级到新版本时服务正在运行, 软件包会尝试在线把它切换到新的可执行文件。如果模块是为前一版本构建的, 新的可执行文件会拒绝该配置,因此切换不会发生: 软件包会输出 Binary upgrade failed 消息,而原来的可执行文件继续提供服务。

升级之后,请重新构建并重新安装模块,沿用第一次构建时的源代码: 重复第 3 步以及第 5 至 8 步,并从第一次构建时执行第 3 步的目录开始; 对于 Angie PRO,请先重复第 2 步。 最后一步使用 install 而不是 cp,因为 install 会写入新文件,而不是覆盖正在运行的服务已加载的那个文件。 然后重启服务,使新的可执行文件带着重新构建的模块启动:

$ sudo angie -t && sudo systemctl restart angie

这里仅重新加载是不够的:重新加载会成功,但正在运行的可执行文件仍会使用它此前已加载的那份模块。 要在不中断服务的情况下切换到新的可执行文件和重新构建的模块, 请使用 在线升级 代替重启。