博客 | NGINX

NGINX 1.9.11 中引入动态模块

NGINX-F5-horiz-black-type-RGB 的一部分
安德鲁·哈钦斯缩略图
安德鲁·哈钦斯
2016 年 2 月 9 日发布


今天,我们发布了开源NGINX 版本 1.9.11 ,其中的一项新功能我们相信会对您使用 NGINX 和NGINX Plus 的方式产生巨大影响:动态模块。 使用动态模块,您可以选择在运行时加载单独的共享对象文件作为模块 - 第三方模块和一些本机 NGINX 模块。 新的实现尽可能地保持与模块 API 的向后兼容性。

编辑器 - 在 NGINX 1.11.5 及更高版本(以及 NGINX Plus R11 及更高版本)中,您可以编译动态模块,而无需编译完整的 NGINX 二进制文件。 有关说明,请参阅为 NGINX Plus 编译动态模块

下一个 NGINX Plus 版本(NGINX Plus R9)将基于此动态模块功能。 我们计划建立一个托管的 NGINX 模块存储库,其中包含一系列我们针对 NGINX Plus 测试和认证的第三方模块,使您可以更轻松地向 NGINX Plus 添加常见扩展。 如果您希望将您的开源或商业模块包含在我们的存储库中,请通过联系销售链接与我们联系。

到目前为止,如果您想为 NGINX 创建一个模块,您必须将其与 NGINX源代码一起编译成 NGINX 二进制文件。 无论您是否需要,该模块每次都会通过 NGINX 加载。 对于操作系统发行版的打包者来说,为每个用户创建自定义的 NGINX 二进制文件变得非常困难。

静态模块被编译到 NGINX 可执行文件中,以便使用 NGINX 启用动态模块
静态模块被编译到 NGINX 可执行文件中

在动态模块的第一个版本中,您仍然需要在编译 NGINX 二进制文件的同时编译可选的 NGINX 模块,但您还为每个动态加载的模块创建一个单独的共享对象,并使用 NGINX 配置文件中的指令在运行时启用和禁用共享对象的加载。

NGINX 动态模块编译成单独的二进制模块共享对象
动态模块被编译成单独的二进制模块共享对象

动态加载 NGINX 模块

在第一个版本中,可以动态构建以下 NGINX 模块和模块包:

要生成动态可加载共享对象,请将=dynamic附加到标准--with_ module参数

# ./configure --with-http_geoip_module=dynamic --with-http_image_filter_module=dynamic --with-mail=dynamic --with-stream=dynamic --with-http_xslt_module=dynamic

当你安装 NGINX 1.9.11源代码时,会有一个名为modules的新子目录,构建过程将二进制共享对象放在那里。 默认情况下,路径为/usr/local/nginx/modules

要在运行时加载模块,请在主上下文中包含新的load_module指令,指定模块共享对象文件的路径(用引号括起来)。 当你重新加载配置或者重新启动 NGINX 时,动态模块就会被加载。 您可以指定相对于源目录的路径(如这些示例所示)或完整路径。

load_module "模块/ngx_http_geoip_module.so";load_module "模块/ngx_stream_module.so";

要动态“卸载”模块,请注释掉或删除其load_module指令并重新加载 NGINX 配置。 如果文件中的任何其他指令与您要卸载的模块相关,请记住将其注释掉或删除。

转换第三方模块

对于许多第三方传统模块的开发人员来说,转换为动态加载所需的工作很少。 在很多情况下,您只需要编辑模块源代码的配置文件。 其他模块将需要做更多的工作。 NGINX Wiki 包含模块转换指南有关模块源配置文件格式的详细信息。

要编译已转换的第三方模块,请使用新的--add-dynamic-module参数并指定路径:

# ./configure --add-dynamic-module=/path/to/module/source

与 NGINX 模块一样,在模块子目录中创建并安装一个共享对象,然后向 NGINX 配置中添加一个load_module指令。 我们的开发者关系团队可以协助转换模块。 通过NGINX 开发邮件列表联系我们。

动态模块的未来

在未来的版本中,我们计划添加在编译 NGINX 二进制文件后编译模块的功能。 我们还正在记录模块 API,完成后该文档将在NGINX Wiki上免费提供。

要亲自尝试动态模块,请下载 NGINX 1.9.11

要试用 NGINX Plus,请立即开始30 天免费试用联系我们讨论您的用例。


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”