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