编辑

编辑

在下面的几行中,我可能有一个特定于站点的配置文件,其中包含其他内容fastcgi_params该网站独有。如果此文件存在,我想加载它。

server {
        listen 80 default;
        server_name _;
        root /path/www/$host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;


                if (-f /path/www/$host/nginx.conf) {
                        include /path/www/$host/nginx.conf;
                }
        }
}

但是,这不起作用,我收到的错误是:

nginx:[emerg] 这里不允许使用“include”指令……

更新

我认为,与其单独检查,不如包括帮我检查一下。

server {
        listen 80 default;
        server_name _;
        root /path/www/$host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;

                include /path/www/$host/*.nginx;
        }
}

但这似乎不起作用。

答案1

include在服务器启动期间执行其操作 - 运行时变量$host不能使用,也不能在上下文中使用if,正如您所发现的。

您需要将server区块拆分为不同的主机。抱歉!

答案2

嗯,这已经很老了,但无论如何,我找到了一种解决方法。

我有一个以这种风格配置的虚拟主机设置:

/etc/nginx/sites-enabled/site.com.conf

我没有检查文件是否存在(这是不可能的),而是简单地执行以下操作:

include /etc/nginx/sites-customizations/site.com.*.conf

这样,我只需在sites-customizations-folder 中创建一个文件,按照我的惯例,该文件的名称与主配置相同。它的*工作原理与 if 非常相似,因为如果没有额外的配置文件,它不会中断。如果您愿意,这还使您能够在单独的文件中添加多个额外的配置。

答案3

我利用了glob()nginx 在指令中使用的函数模式扩展,include并且在我的 Debian 服务器上运行良好。

对于您的情况,请尝试替换此行:

include /path/www/$host/nginx.conf;

用这个:

include /path/www/<hostname>/nginx[.]conf;

它是一个仅匹配一个文件的文件掩码,如果文件不存在,nginx 不会发出任何抱怨。但是,include 指令中不允许使用变量,因此您必须在 中提供一个固定值<hostname>。我们必须创建一个脚本来生成单独的 .conf 文件(每个 vhost 一个)。

编辑

作为杰拉德·施奈德指出,我建议保留$host替换,这是不允许的。我已经更改了上面的建议。

答案4

我知道这已经过时了,但解决方案可能会帮助那些像我一样寻找答案的人。

我有一堆重定向需要仅包含在特定主机中,虽然指令include中不允许if,但我最终将其添加到了if我所包含的文件内......

所以我有一个include /etc/nginx/conf.d/redirects并且在该文件里面我有:

if ($host = "www.example.com") {
    # Some conf or redirects for this site only.
}

相关内容