仅当安装了模块时才在 nginx.conf 中应用指令(apache ifmodule 替代)

use*_*925 4 nginx

apache 中的 ifmodule 指令有什么替代方法吗?

我正在尝试为我们公司创建一个通用的 nginx.conf 文件,但有些站点对具有 geoip 模块有特殊要求。在这些站点中,我需要在 nginx.conf 中的 http 部分声明一个指令来定义国家/地区数据库。

问题是在其他服务器中,该模块没有被编译,所以我需要注意只有在安装了该模块时才加载它。

任何的想法?提前致谢!

Mic*_*sky 6

很抱歉让您失望,这是不可能的,今天的 nginx 不可能。通过不同的论坛和邮件列表不止一次说过 nginx 配置不支持宏或条件包含。这就是你所追求的。除了一些最小的东西外,配置在 nginx 中是非常静态的。你不能像在 apache 上那样“编程”它。我会很高兴知道我错了,但是 ATM 我们都求助于黑客。取决于您的环境,但如果您控制服务器,您可以将 geoip 放入一个单独的目录并使用 globbing 来包含。也就是说,不要在没有 geoip 的服务器上放置任何文件,如果模块存在,则在那里放置一个带有 geoip config 的配置文件。如果这不是一个选项,您可能必须修改 init 脚本以进行检查并调整配置。

例子:

假设你有一个目录: /etc/nginx/geoip/

在带有 geoip 模块的服务器上,目录中有一个文件:default.http.scope

文件内容:

geoip_country /usr/share/GeoIP/GeoIP.dat
Run Code Online (Sandbox Code Playgroud)

在没有 geoip 模块的服务器上,目录是空的。

在 http 范围的 nginx 配置中,您可以安全地执行以下操作:

include /etc/nginx/geoip/*.http.scope
Run Code Online (Sandbox Code Playgroud)

在两台服务器上,只有与模式匹配的文件才会尝试配置 geoip。