使用vhost模板

时间:2013-02-07 10:34:31

标签: file dynamic nginx debian vhosts

我在Debian上使用nginx。因此除了主配置文件/etc/nginx/nginx.conf之外,还有文件夹/ etc / nginx / sites-available /与vhost配置文件和/ etc / nginx / sites-enabled /以及指向活动虚拟主机的链接。

所以让我先问我的问题。因为解释很长,也许你不需要阅读它......


我希望能够使用这样的几个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/;
    ...
}

并定义哪个vhost基于哪个模板。此外,有可能“扩展”模板,以便我可以向我的虚拟主机添加新设置并重新定义从模板继承的设置。

我该如何实现?


我当前的vhost文件结构如下所示:

/ etc / nginx / sites-available包含以下文件:

  

默认(默认vhost)ax-common-vhost(vhost模板)   test.sandbox.loc(vhost基于模板ax-common-vhost;它   包括include规则...以及其他一些......

/ etc / nginx / sites-available包含以下文件:

  

默认 - &gt; / etc / nginx / sites-available / default test.sandbox.loc - &gt;   /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/;
    ...
}

因此,当我想创建一个新的虚拟主机时,我只需创建一个新的虚拟主机文件及其链接 - 并且不需要复制和粘贴设置并手动设置路径。我只需要遵循惯例,主机%项目%。%area%.loc将被放置在[my webroot] /%area%/%project%

我想,它适用于include规则:服务器获取请求xyloc,查找名为so的文件,打开文件,最后处理其中的指令(所以include指令和整个内容包含的模板)。

但事实并非如此。 Nginx似乎只是扫描整个文件夹/ etc / nginx / sites-available /(按字母顺序?)并保留第一个文件/ server指令,请求中的主机名等于/匹配。

这意味着,包括

include /etc/nginx/sites-available/ax-common-vhost;

未使用。实际上,我已经从vhost文件中删除了include指令 - 并且没有任何改变!

这是一个问题。因为当我添加新模板时,例如对于我的Zend Framework项目(使用[project root] / public / as 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 maches到模式^(?。+)。(?。+)。loc $,和nginx使用ax-common-vhost for myzf.sandbox.loc。

如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:1)

好的,现在就可以了!

我已经更改了基本vhost文件的server_name块,因此它只使用指令中列出的主机名来填充请求:

文件ax-common-vhost:

server {
    listen   80;
    server_name test.sandbox.loc foo.sandbox.loc bar.sandbox.loc;
    ...
}

而不是通用server_name ~^(?<project>.+)\.(?<area>.+)\.loc$;

/ etc / nginx / sites-available /中的vhost文件test.sandbox.loc,foo.sandbox.loc,bar.sandbox.loc等以及/ etc / nginx / sites-enabled /中的链接不再需要了。我已经创建了一个链接/ etc / nginx / sites-enabled / ax-common-vhost到/ etc / nginx / sites-available / ax-common-vhost。

第二个公共vhost文件的方法是相同的,它可以工作。

第一个问题已经解决:设置可以由多个vhosts / server块共享,我可以轻松添加新的vhost而无需复制设置。

但是:具有设置的vhost文件无法通过其他文件进行扩展。 是否可以这样做,以便文件B可以“扩展”文件A,继承其设置并仅覆盖指令/规则?我怎么能意识到这一点?