您如何有条件地在Nginx vhost中包含文件?


12

在下面的行中,我可能会有一个特定于站点的配置文件,其中包含该站点唯一的其他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;
        }
}

但是,这似乎不起作用。


您找到解决此问题的方法了吗?我在同一条船上,我想知道你是怎么做到的?
jackweirdy 2013年

抱歉,我想终于解决了其他问题。
Xeoncross 2013年

Answers:


8

include正如您所发现的那样,它在服务器启动期间完成了它的工作- $host无法使用运行时变量,也无法在if上下文中使用它。

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


31

好吧,这已经很老了,但是无论如何,我找到了解决方法。

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

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

而不是检查文件是否存在(不可能),我只是这样做:

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

这样,我可以简单地在sites-customizations-folder中创建一个文件,按照我的约定,该文件的名称与主配置相同。该*工程非常类似于if,因为如果没有额外的配置文件,它不会中断。如果愿意,还可以在单​​独的文件中添加多个额外的配置。


5

我知道这很古老,但是解决方案可能会像我一样帮助某人寻找答案。

我有一堆重定向,只需要包含特定主机的重定向,而includeif指令中不允许这样做,但最终if我在要包含的文件内部添加了重定向...

所以我有一个include /etc/nginx/conf.d/redirectsand在那个文件中,我有:

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

5

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

您的情况下,请尝试替换以下行:

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

与此:

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

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

编辑

正如Gerald Schneider指出的那样,我建议保留$host替代产品,这是不允许的。我已经改变了上面的建议。


1
该变量$host在这里仍然无法使用。
Gerald Schneider

抱歉,您是对的,include指令中不允许使用变量。我们使用python脚本为列表中的每个虚拟主机创建一个.conf,但是我们广泛使用了“自定义”其他每个虚拟主机与标准的偏差。
Alberto Pastore
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.