2013-02-07 77 views
1

我在Debian上使用nginx。因此,除了在主配置文件/etc/nginx/nginx.conf有文件夹的/ etc/nginx的/网站可用/与虚拟主机配置文件和/ etc/nginx的/ /与链接到虚拟主机主动启用的站点 - 。使用虚拟主机模板

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


我希望能够使用多个虚拟主机模板是这样的:

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/; 
    ... 
} 

和定义哪个虚拟主机基于哪个模板。此外,有可能“扩展”模板会很棒,因此我可以将新设置添加到我的虚拟主机,并重新定义从模板继承的设置。

我怎样才能实现呢?


我目前的虚拟主机的文件结构是这样的:

的/ etc/nginx的/位,可包含下列文件:

默认值(默认的虚拟主机)斧常见的虚拟主机(虚拟主机模板) test.sandbox.loc(基于模板ax-common-vhost的虚拟主机;它包括与include规则)...和其他一些...

的/ etc/nginx的/位,可包含下列文件:

默认 - >的/ etc/nginx的/网站可用/默认test.sandbox.loc - > 的/ etc/nginx的/ sites-可用/ test.sandbox.loc ......以及一些进一步 的...

模板斧常见的虚拟主机定义像根文件夹选项的一些动态,使用服务器名称:

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的文件,打开文件,并最终处理其中的指令(所以include指令和包含的模板的全部内容)。

但它并非如此。 Nginx的似乎只是扫描整个文件夹的/ etc/nginx的/网站可用/(按字母顺序?),并在第一个文件按住/ server指令在请求的主机名称等于/ maches来。

这就是说,通过包括

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

不被使用。实际上,我已经从vhost文件中删除了包含指令 - 而且没有任何改变!

这是一个问题。因为当我添加一个新的模板,例如我的Zend框架项目([项目根] /公/根):

文件AX-ZF的虚拟主机

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。

这个问题怎么解决?

谢谢

回答

1

好吧,现在工作吧!

我已经改变了我的基本的虚拟主机文件的服务器名称块,所以它仅porecces在该指令中列出的主机名要求:

文件斧常见的虚拟主机:

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

代替的通用server_name ~^(?<project>.+)\.(?<area>.+)\.loc$;

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

第二个通用虚拟主机文件的方法是相同的,它的工作原理。

第一个问题已解决:这些设置可以由多个虚拟主机/服务器模块共享,我可以轻松添加新的虚拟主机而无需重复设置。

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