首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用vhost模板

使用vhost模板
EN

Stack Overflow用户
提问于 2013-02-07 10:34:31
回答 1查看 354关注 0票数 1

我在Debian身上用了nginx。因此,除了主配置文件/etc/nginx/nginx.conf之外,还有文件夹/etc/nginx/sites-可用/与vhost配置文件一起使用;/etc/nginx/sites-启用/带有指向活动vhost的链接。

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

我希望能够使用以下几个vhost模板:

代码语言:javascript
复制
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添加新的设置,并重新定义从模板继承的设置。

我怎样才能做到这一点?

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

/etc/nginx/sites现有文件如下:

默认(默认vhost) ax公共vhost (vhost模板) test.sandbox.loc (vhost基于模板ax公共vhost;它包括include规则) ...and一些进一步的.

/etc/nginx/sites现有文件如下:

默认-> /etc/nginx/站点-可用/默认test.sandbox.loc -> /etc/nginx/站点-可用/test.sandbox.loc ...and

使用服务器名,模板ax公共-vhost动态定义一些选项,如根文件夹:

代码语言:javascript
复制
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文件和一个指向它的链接--而不需要复制和粘贴设置并手动设置路径。我只需要遵循惯例,主机%project%.%area%.loc将被放置在我的webroot/%区域%/%项目%中。

我想,它可以在包含规则上工作:服务器获得一个请求x.y.loc,查找一个名为so的文件,打开文件,最后处理其中的指令(因此包含指令和包含的模板的全部内容)。

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

这意味着,

代码语言:javascript
复制
include /etc/nginx/sites-available/ax-common-vhost;

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

这是个问题。因为当我添加一个新模板时,例如对于Zend Framework项目(带有项目根/public/ as root):

文件ax-zf-vhost

代码语言:javascript
复制
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的信息,因此忽略了vhost是基于about的。而不是这样,它只循环/etc/ nginx /sites available/文件夹,找到ax-公共-vhost,myzf.sandbox.loc机器到模式^(?.+).(?.+).loc$,而nginx使用ax公共-vhost作为myzf.sandbox.loc。

如何解决这个问题呢?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2013-02-07 13:16:45

好了,它现在起作用了!

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

文件ax-公共-vhost:

代码语言:javascript
复制
server {
    listen   80;
    server_name test.sandbox.loc foo.sandbox.loc bar.sandbox.loc;
    ...
}

而不是一般的server_name ~^(?<project>.+)\.(?<area>.+)\.loc$;

vhost文件test.sandbox.loc、foo.sandbox.loc、bar.sandbox.loc等在/ etc /nginx/site中已经启用/不再需要了。我已经创建了一个链接/etc/nginx/sites启用/ax公共-vhost到/etc/nginx/sites available/ax公共-vhost。

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

第一个问题已经解决:设置可以由多个vhost/服务器块共享,而且我可以轻松地添加新的vhost,而无需重复设置。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14748974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档