【发布时间】:2013-01-22 19:49:35
【问题描述】:
我在 Debian 上使用 nginx。因此,除了主配置文件 /etc/nginx/nginx.conf 之外,还有文件夹 /etc/nginx/sites-available/ 与 vhost 配置文件和 /etc/nginx/sites-enabled/ 与活动虚拟主机的链接。
所以让我先问我的问题。因为解释很长,也许你不需要看……
我希望能够像这样使用多个虚拟主机模板:
server {
listen 80;
server_name ~^(?<project>.+)\.(?<area>.+)\.loc$;
if ($host ~ ^(?<project>.+)\.(?<area>.+)\.loc$) {
set $folder "$area/$project";
}
...
access_log /var/log/nginx/$area/$project.access.log;
error_log /var/log/nginx/error.log;
...
root /var/www/$folder/;
...
}
并定义哪个虚拟主机基于哪个模板。此外,如果有可能“扩展”模板,我可以向我的虚拟主机添加新设置并重新定义从模板继承的设置。
我该如何实现?
我当前的 vhost 文件结构如下所示:
/etc/nginx/sites-available 包含以下文件:
default(默认虚拟主机) ax-common-vhost(虚拟主机模板) test.sandbox.loc (vhost 基于模板 ax-common-vhost; 它 包括
include规则)...以及其他一些...
/etc/nginx/sites-available 包含以下文件:
默认 -> /etc/nginx/sites-available/default test.sandbox.loc -> /etc/nginx/sites-available/test.sandbox.loc ...还有更多 那些...
模板 ax-common-vhost 使用服务器名称动态定义了一些选项,如根文件夹:
server {
listen 80;
server_name ~^(?<project>.+)\.(?<area>.+)\.loc$;
if ($host ~ ^(?<project>.+)\.(?<area>.+)\.loc$) {
set $folder "$area/$project";
}
...
access_log /var/log/nginx/$area/$project.access.log;
error_log /var/log/nginx/error.log;
...
root /var/www/$folder/;
...
}
所以当我想创建一个新的虚拟主机时,我只需创建一个新的虚拟主机文件和一个指向它的链接——并且不需要复制和粘贴设置并手动设置路径。我只需要遵循约定,必须将主机 %project%.%area%.loc 放置在 [my webroot]/%area%/%project%
我想,它适用于包含规则:服务器获取一个请求 xyloc,查找一个名为 so 的文件,打开该文件,最后处理其中的指令(因此包含指令和包含的模板)。
但事实并非如此。 Nginx 似乎只是扫描整个文件夹 /etc/nginx/sites-available/ (按字母顺序?)并保留第一个文件 / server 指令请求中的主机名等于/匹配。
也就是说,包含
include /etc/nginx/sites-available/ax-common-vhost;
未使用。实际上,我已经从 vhost 文件中删除了 include 指令——没有任何改变!
这是一个问题。因为当我添加一个新模板时,例如对于我的 Zend Framework 项目(以 [project root]/public/ 作为 root):
文件 ax-zf-vhost
server {
listen 80;
server_name ~^(?<project>.+)\.(?<area>.+)\.loc$;
if ($host ~ ^(?<project>.+)\.(?<area>.+)\.loc$) {
set $folder "$area/$project";
}
...
access_log /var/log/nginx/$area/$project.access.log;
error_log /var/log/nginx/error.log;
...
root /var/www/$folder/public/;
...
}
...,它被忽略了,因为服务器没有得到任何关于 vhost myzf.sandbox.loc 基于 ax-zf-vhost 的信息。而不是这个,它只是循环 /etc/nginx/sites-available/ 文件夹,找到 ax-common-vhost,myzf.sandbox.loc 匹配模式 ^(?.+).(?.+).loc$,并且 nginx 使用 ax-common-vhost 作为 myzf.sandbox.loc。
如何解决这个问题?
谢谢
【问题讨论】:
标签: file dynamic nginx debian vhosts