我想要做的是防止在未安装正确模块的 nginx 中运行带有无效指令的配置段。Apache 中的 IfModule 指令(http://httpd.apache.org/docs/current/mod/core.html#ifmodule)。nginx 中是否存在类似的东西?
答案1
如果加载了特定模块,Apache 将<IfModule>
应用一组指令。
由于Nginx不支持动态模块加载,因此此功能不可用。
答案2
据我所知,无法从配置文件中确定功能是否可用。
如果希望测试配置更改是否在当前设置下有效,可以在更改生效之前使用 configtest 命令:(nginx -t
或/etc/init.d/nginx configtest
)。但这并不理想。
nginx 从 1.9.11 版本开始支持动态模块加载(2016 年 2 月公告)。但是,我们无法根据模块的存在与否来提供替代配置。
不应将动态或静态加载模块的能力与使用配置文件中的指令测试相关模块是否启用的能力混为一谈。无论模块以何种方式添加到二进制文件中,能够测试模块化功能是否可用都是值得支持的合理功能。该功能目前尚未实现,除了少数在配置中具有明显副作用的模块(例如,添加自定义响应标头将在请求处理的后续步骤中可见)。
如果部署中有一个选项“脚本粘合”用于测试功能,则在命令行上可以执行:nginx -V
查看编译时已知模块的列表。输出将包含--with-*
和--add-dynamic-module
标志的混合。
--with-http_v2_module
表示静态编译到二进制文件中的模块(在本例中即 http_v2_module);--add-dynamic-module=/path/to/module_name
表示动态模块。可以使用load_module module_name.so
核心指令来启用(禁用)而无需重新编译 nginx。