编辑 - 这篇文章是关于使用NGINX和NGINX Plus的第三方动态模块的两部分系列的一部分。

  • 第一篇文章提供了编译第三方动态模块的逐步说明,这些模块可以在运行时由NGINX或NGINX Plus加载。
  • 本文提供了用于为生产环境自动化第三方动态模块构建的指导和工具。它解释了如何为包含版本依赖性检查的第三方动态模块创建可安装包。

NGINX 1.11.5和NGINX Plus R11引入了对独立于NGINX本身编译动态模块的支持。这允许NGINX和NGINX Plus的用户使用NGINX,Inc。存储库中的官方版本并加载他们需要的动态模块。动态模块有几个来源:

本博客侧重于使用NGINX和NGINX Plus的第三方动态模块。我们将讨论在生产环境中构建,部署和升级动态模块的最佳实践。有关适用于开发和测试环境的更基本的模块编译说明,请参阅为NGINX和NGINX Plus编译第三方动态模块

.so文件的问题

编译动态模块时,原始输出是共享对象(.so文件)。在启动和重新加载时,NGINX和NGINX Plus会加载由load_module指令命名的每个共享对象(按照惯例,它们位于主配置文件nginx.conf中)。共享对象的常规目录是/ etc / nginx / modules

动态模块与NGINX和NGINX Plus的官方版本二进制兼容。但是,这种二进制兼容性有局限性。必须根据加载的相同版本的NGINX编译动态模块。对于NGINX Plus,必须根据构建NGINX Plus的开源版本编译动态模块。这意味着升级NGINX或NGINX Plus而不首先安装针对匹配版本构建的新版本的动态模块会导致升级失败

手动管理NGINX与其动态模块之间的依赖关系容易出错。动态模块.so文件不指示它们构建的NGINX版本,这使得手动复制它们的过程有些不稳定。在开发环境中,这通常是可以接受的,但对于生产环境,需要保护依赖关系并自动升级。

目标是在升级NGINX或NGINX Plus时自动升级所有动态模块,无论该模块是由NGINX,认证模块供应商还是第三方供应商提供。

打包具有依赖关系的动态模块

如果您使用NGINX或NGINX Plus的官方存储库,那么您已经熟悉使用软件包管理器来安装和升级NGINX - yum适用于Red Hat / CentOSapt适用于Ubuntu / Debian。官方NGINX和NGINX Plus存储库还包含许多动态模块的可安装包。动态模块包的元数据指示模块编译的NGINX版本,在NGINX或NGINX Plus升级期间自动触发模块升级。

使用可安装的第三方动态模块包是兑现NGINX依赖关系,避免升级失败和促进无缝升级的关键。

NGINX,Inc。使用自动化工具为我们的官方存储库创建动态模块包。此工具称为pkg-oss,也可用于为第三方模块创建可安装程序包。

您可以使用pkg-oss工具为任何动态模块创建可安装的包。它还包括一个脚本build_module.sh,它自动化该过程,作为如何创建一个具有对NGINX或NGINX Plus的正确依赖性的可安装包的示例。只需指定NGINX或NGINX Plus的版本以及动态模块源的位置即可。模块源可以位于本地磁盘上,指向GitHub存储库,也可以是常规下载链接。以下示例在Ubuntu / Debian上为NGINX Plus R11 构建RTMP模块

$ wget https://hg.nginx.org/pkg-oss/raw-file/default/build_module.sh
$ chmod a+x build_module.sh
$ ./build_module.sh -r 11 https://github.com/arut/nginx-rtmp-module.git
...
build_module.sh: INFO: Module packages created
~/debuild/nginx-plus-module-rtmp_1.11.5_amd64.deb
~/debuild/nginx-plus-module-rtmp-dbg_1.11.5_amd64.deb

文件名表示该模块是针对NGINX Plus R11(1.11.5)的基本NGINX版本构建的,我们可以通过检查包元数据来确认。

$ dpkg-deb -f ~/debuild/nginx-plus-module-rtmp_1.11.5_amd64.deb Depends
libc6 (>= 2.14), nginx-plus (>> 1.11.4), nginx-plus (<< 1.11.6)

使用build_module.sh脚本时,请注意以下几点。

  • 在构建环境中运行脚本在
    生产环境中,最佳做法是仅安装正确操作所需的软件,其中不包括编译和打包动态模块所需的工具。我们建议在单独的构建环境中运行build_module.sh脚本,但在与生产相同的平台上运行。
  • 该脚本不适用于每个模块
    该脚本已经在NGINX可用的绝大多数第三方模块上成功测试过。它甚至尝试动态地将静态模块升级到动态模块。但是,某些模块具有脚本无法预测的额外编译时依赖性,或者需要与其他软件组件一起打包。
  • 可安装程序包不用于重新分发
    该脚本创建可供安装程序包供内部使用。包中没有版权,许可或文档。如果您计划将模块重新分发为可安装程序包,则可以使用pkg-oss工具定义自定义程序包。
  • 无缝升级需要一个yumapt存储库
    该脚本提供了一种为动态模块构建可安装包的便捷方法,但它不会自动提供无缝升级解决方案,除非从包yumapt存储库安装包。本文的其余部分介绍了如何实现无缝升级。

为无缝升级设置私有存储库

许多组织使用私有存储库来分发软件。将NGINX pkg-oss工具生成的.deb.rpm文件复制到此类存储库后,您可以使用用于安装NGINX和NGINX Plus的相同软件包管理器来安装,删除和升级动态模块。如果您没有私有存储库,那么在服务器上本地创建一个私有存储库是一个简单的练习。

为了说明这个过程,我们展示了如何为Ubuntu / Debian和Red Hat / CentOS创建一个私有存储库,以便我们的动态模块可以安装apt(8)yum(8)分别安装。请注意,这些步骤需要root访问。此外,我们在本节中省略了命令提示符以便于复制和粘贴。

  1. 准备依赖项并为包管理器创建本地存储库。
    • 在Ubuntu / Debian系统上:
      mkdir /opt/deb
      echo "deb file:/opt deb/" > /etc/apt/sources.list.d/local.list
    • 在Red Hat / CentOS系统上:
      yum install createrepo
      mkdir /opt/rpm
      cat << EOF > /etc/yum.repos.d/localrepo.repo 
      [localrepo]
      name=Dynamic modules for NGINX
      baseurl=file:///opt/rpm
      gpgcheck=0
      enabled=1
      EOF
  2. 将动态模块的可安装包复制到本地存储库。
    • 在Ubuntu / Debian系统上:
      cp ~/debuild/nginx-plus-module-rtmp_1.11.5_amd64.deb /opt/deb
    • 在Red Hat / CentOS系统上:
      cp ~/rpmbuild/RPMS/x86_64/nginx-plus-module-rtmp-1.11.5-1.el7.centos.ngx.x86_64.rpm /opt/rpm
  3. 更新程序包管理器以了解动态模块程序包。
    • 在Ubuntu / Debian系统上:
      cd /opt && dpkg-scanpackages deb | gzip > deb/Packages.gz
      apt-get update
    • 在Red Hat / CentOS系统上:
      createrepo -v /opt/rpm
      yum clean all
      yum update
  4. 对每个模块重复步骤2和3。

从专用存储库安装模块

当动态模块存储在专用存储库中时,您可以使用本地程序包管理器来安装它。

  • 在Ubuntu / Debian系统上:
    $ apt-get install nginx-plus-module-rtmp
  • 在Red Hat / CentOS系统上:
    $ yum install nginx-plus-module-rtmp

请注意,程序包的名称与构建脚本生成的文件名相同,没有版本和平台信息。

安装完成后,横幅说明如何配置NGINX以加载新安装的动态模块。

----------------------------------------------------------------------

The rtmp dynamic module for nginx has been installed.
To enable this module, add the following to /etc/nginx/nginx.conf
and reload nginx:

    load_module modules/ngx_rtmp_module.so;

----------------------------------------------------------------------

无缝升级

通过以这种方式安装动态模块,您可以在升级NGINX或NGINX Plus时防止版本不匹配。如果在升级安装的动态模块之前尝试升级NGINX或NGINX Plus,则本地程序包管理器会报告该问题。

  • 在Ubuntu / Debian系统上:
    $ apt install nginx-plus
    ...
    The following packages will be REMOVED
      nginx-plus-module-rtmp
    The following packages will be upgraded:
      nginx-plus
    Do you want to continue? [Y/n]
  • 在Red Hat / CentOS系统上:
    $ yum install nginx-plus
    ...
    Error: Package:‌ nginx-plus-module-rtmp-1.11.5-1.el7.centos.ngx.x86_64 (@localrepo)
    Requires: nginx-plus = 1.11.5

要确保无缝升级,请首先针对您要升级到的NGINX或NGINX Plus版本构建新版本的动态模块。以下示例显示了在安装了RTMP动态模块的情况下将NGINX Plus从R11升级到R12所需的步骤。

  1. 为NGINX Plus R12构建动态模块。
    $ ./build_module.sh -r 12 https://github.com/arut/nginx-rtmp-module.git
    ...
    build_module.sh: INFO: Module packages created
    ~/debuild/nginx-plus-module-rtmp_1.11.10_amd64.deb
    ~/debuild/nginx-plus-module-rtmp-dbg_1.11.10_amd64.deb
  2. 设置用于无缝升级的专用存储库重复步骤2和3,以使用新的动态模块更新专用存储库。
  3. 升级NGINX Plus。
    • 在Ubuntu / Debian系统上:
      $ apt-get install nginx-plus
      Reading package lists... Done
      Building dependency tree       
      Reading state information... Done
      The following packages will be upgraded:
        nginx-plus nginx-plus-module-rtmp
      2 to upgrade, 0 to newly install, 0 to remove
      Need to get 2,571 kB/2,731 kB of archives.
      After this operation, 411 kB of additional disk space will be used.
      Do you want to continue? [Y/n]
    • 在Red Hat / CentOS系统上:
      $ yum install nginx-plus
      ...
      Resolving Dependencies
      --> Running transaction check
      ---> Package nginx-plus.x86_64 0:1.11.5-1.el7.ngx will be updated
      --> Processing Dependency:
       ---> Package nginx-plus-module-rtmp.x86_64 0:1.11.5-1.el7.centos.ngx will be updated
      --> Finished Dependency Resolution
      
      Dependencies Resolved
      
      =========================================================================
       Package                Arch   Version                  Repository  Size
      =========================================================================
      Updating:
       nginx-plus             x86_64 1.11.10-3.el7.ngx        nginx-plus 2.4 M
      Updating for dependencies:
       nginx-plus-module-rtmp x86_64 1.11.10-1.el7.centos.ngx localrepo  176 k
      
      Transaction Summary
      =========================================================================
      Upgrade  1 Package (+1 Dependent package)
      
      Total download size: 2.6 M
      Is this ok [y/d/N]:

摘要

NGINX和NGINX Plus的动态模块使您只需编译所需的特定扩展,同时利用NGINX,Inc。预构建和测试的软件包.pkg-oss工具和build_module.sh脚本为创建,安装提供了直接的解决方案,以及升级第三方模块以进行NGINX和NGINX Plus的生产部署。

via https://www.nginx.com/blog/creating-installable-packages-dynamic-modules/

为nginx动态模块创建可安装包
标签: