我在Debian身上用了nginx。因此,除了主配置文件/etc/nginx/nginx.conf之外,还有文件夹/etc/nginx/sites-可用/与vhost配置文件一起使用;/etc/nginx/sites-启用/带有指向活动vhost的链接。
所以,让我先问我的问题。因为解释很长也许你不需要读它..。
我希望能够使用以下几个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添加新的设置,并重新定义从模板继承的设置。
我怎样才能做到这一点?
我当前的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动态定义一些选项,如根文件夹:
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。
这意味着,
include /etc/nginx/sites-available/ax-common-vhost;不被使用。实际上,我已经从vhost文件中删除了包含指令--没有什么改变!
这是个问题。因为当我添加一个新模板时,例如对于Zend Framework项目(带有项目根/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的信息,因此忽略了vhost是基于about的。而不是这样,它只循环/etc/ nginx /sites available/文件夹,找到ax-公共-vhost,myzf.sandbox.loc机器到模式^(?.+).(?.+).loc$,而nginx使用ax公共-vhost作为myzf.sandbox.loc。
如何解决这个问题呢?
谢谢
发布于 2013-02-07 13:16:45
好了,它现在起作用了!
我已经更改了基本vhost文件的server_name块,因此它只使用指令中列出的主机名来处理请求:
文件ax-公共-vhost:
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,继承其设置并只覆盖指令/规则?我怎么能意识到这一点?
https://stackoverflow.com/questions/14748974
复制相似问题