相信有那麼一天,我們將可以像畢凱艦長一樣用嘴巴叫所有主機做事!


Cheng Wei Chen



多個 virtual host 共用一個 Nginx Site Config

目前在網站開發時,已有固定的開發部署流程,我們會依據 development -> staging -> production 的順序部署。在比較小型的專案,有時為了節省資源,會將多個 development 網站部署在同一台 VPS,透過給予不同的專案 domain,再配合 Nginx 做出 virtual host 來運行。

其實 Nginx 在 Config 檔案之中,可以使用一些簡易的判斷式及變數,因此雖然是多個專案使用同一台 VPS,但也只需要設定一次 Nginx Site Config 檔即可。


實作的方式如下:
首先規劃出固定的 domain 及 folder 路徑規則。

domain 規則為 XXXXX.dev.site
舉例:projectA.dev.site、projectB.dev.site

Folder 規則為 /var/www/XXXXX/
舉例:/var/www/projectA/ 、 /var/www/projectB/

接著在 Nginx 中,建立一個 Site Config,並其中有兩個地方要使用變數,分別是 server_name、root,可以參閱下面的範例。
server_name ~^(.*)\.dev\.site$;
set $project $1;
root /var/www/$project/;
如此一來,只要是從任何吻合此正規表達式的 domain 進來,Nginx 會將 domain 的第一個單字丟進變數 $1,接著再新增變數 $project = $1,第三行告知 Nginx 要去何處取得此網站檔案,檔案路徑中則包含了變數 $project。

假設是從 abc.dev.site 進來,則 $project 就會等於 abc。

透過上述的方式,即可達到只用一個 Site Config 就能運行多個不同的網站,也就不用每次新專案啟動或專案結束,又要手動管理一次 development 機的 Nginx Site Config。

其實在 server_name 可以取得不只一個變數,例如改成下面的格式,即可根據 domain 拿到兩個變數。
server_name ~^(.*)\.(.*)\.site$; set $var1 $1; set $var2 $2;
因此同樣假設是從 abc.dev.site 進來,則 $var1 會等於 abc、$var2 則會等於 dev。


2015/4/22 補充說明:
發現有人寫了一篇更好的除了 Nginx 也說明了 Apache 該如何做,補上來當參考資料。

參考資料:


沒有留言:

張貼留言

不歡迎留言打廣告,所以有進行留言管理,敬請見諒。