2013-02-07 79 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,繼承它的設置並僅覆蓋指令/規則?我怎麼能意識到這一點?