自動化虛擬主機創建過程
直到最近,我還使用 Cpanel 或 Webmin 等工具來管理 Apache2 虛擬主機。我最近發現瞭如何在
sites-available
目錄下手動創建這些。我可以一次又一次地手動執行此過程,但是當手動完成時,它包括大量的應對和粘貼、重複的字元串更改(一次用於文件名和其中的域 + tld,以及進一步的執行,例如
a2ensite
(見下文)。我現在尋求自動化該過程,但我不確定在內部(在 Vhost 中)和外部(在文件名和進一步執行中)更改域 + tld 的最佳方法是什麼
這是我手動創建每個 Vhost 的方式:
1. Copy a ready Vhost template file (I have such a file which I name `d.t` and I clone it whenever I need to create a new Vhost): <VirtualHost *:80> DocumentRoot "/var/www/html/d.t" ServerName www.d.t <Directory "/var/www/html/d.t"> Options +SymLinksIfOwnerMatch Require all granted </Directory> ServerAlias www.d.t </VirtualHost> 3. Search and replace "d.t", with domain+tld: Do in nano. 4. Replace filename (d.t) with domain+tld: mv /etc/apache2/sites-available/d.t /etc/apache2/sites-available/domain.tld 5. Enable domain.tld.conf & restart the Apache service: a2ensite domain.tld.conf && systemctl restart apache2.service
這可能看起來很簡單,但是當我從手動文件手動執行此算法時,可能需要更多時間將每個範例(如 dt)重寫到相關的域 + tld 中。
我的問題:
我正在尋找一種方法來執行具有這些操作的腳本:該腳本實際上看起來非常相似,但在此腳本中,
d.t
將替換為該腳本的文件名。例如,如果腳本的文件名是MyNewVhost.com
,則其中的每次d.t
出現都將變為MyNewVhost.com
.我想一些可變的工作可以達到這個目的,但我可能錯了;如果是這樣,我需要一種告訴程序“將文件名放入每個 dt”的方法。
筆記:
- 我相信答案也可以為在 Nginx 伺服器塊(Nginx Sblocks)中有類似問題的人提供一個很好的方向。
GNU
make
執行良好您可以使用 GNU
make
1,其中創建一個新的虛擬主機就像執行一樣簡單make example.com
簡短而簡單:一個靜態模板
首先,創建
/etc/apache2/sites-available/Makefile
包含:% : printf '%s\n' \ '<VirtualHost *:80>' \ ' DocumentRoot "/var/www/html/$@"' \ ' ServerName www.$@' \ ' <Directory "/var/www/html/$@">' \ ' Options +SymLinksIfOwnerMatch' \ ' Require all granted' \ ' </Directory>' \ ' ServerAlias www.$@' \ '</VirtualHost>' \ > "$@" a2ensite "$@" systemctl restart apache2.service
請注意,後面的每一行都
% :
以製表符開頭,而不是空格。另請注意,其中大部分實際上是您的模板文件,但d.t
替換為$@
.在此之後,您可以創建一個名為的新虛擬主機
domain.tld
:cd /etc/apache2/sites-available make domain.tld
添加選項:多個模板
這是最簡單的使用方法之一
make
。對於稍微複雜的配置,假設您有兩個(或更多)模板。我將在這裡展示一個,我稱之為basic.template
,作為一種模式:<VirtualHost *:80> DocumentRoot "/var/www/html/$domain$" ServerName www.$domain$ <Directory "/var/www/html/$domain$"> Options +SymLinksIfOwnerMatch Require all granted </Directory> ServerAlias www.$domain$ </VirtualHost>
然後,您將修改(簡化!)您的
Makefile
:% : sed 's/\$$domain\$$/$@/g' < "$<" > "$@" a2ensite "$@" systemctl restart apache2.service .PHONY : all all : @true
這裡的配方涉及使用用預期的域名
sed
替換錶單的變數。$domain$
此外,我添加了一個PHONY
名為 的目標all
,它的用途很快就會顯現出來。現在要創建虛擬主機,您必須指定要使用的模板。對我來說,最好將其包裝在腳本中。
#!/bin/sh # File update-makefile # Call as: # ./update-makefile domain.tld basic.template sed '/^all :/s/$/ '"$1"'/' < Makefile > Makefile.new printf '%s\n' "$1 : $2" >> Makefile.new mv Makefile.new Makefile
請注意,這還有一個將新虛擬主機添加到 Makefile的附加步驟。這讓我們看看依賴
make
於哪個模板。然後你可以這樣做:domain.tld
cd /etc/apache2/sites-available ./update-makefile domain.tld basic.template && make
使用此設置,如果其相應的模板已更改,每個站點都將更新。
all
成為第一個命名的目標很重要。這使得它在make
不帶參數的情況下被呼叫時的預設值。該update-makefile
腳本將新域添加為 的依賴項all
,因此make
如果它相對於它自己的依賴項(模板文件)過時,將重新創建它。1是一種 工具,
make
用於從一組記錄在. 在 GNU 語法中,Makefile
% : # do stuff
是模式規則。它聲明可以將具有任何名稱 (
%
) 的文件創建為目標,並且它沒有依賴關係。是# do stuff
配方(任何 shell 腳本),縮進一個製表符。您可以使用一些變數來引用目標的名稱 ($@
)、第一個依賴項 ($<
) 或所有依賴項 ($^
) 等。有關詳細資訊,請參閱維基百科。您的系統可能尚未
make
安裝,在這種情況下,您必須自己安裝。此外,一些系統使用make
. 概念是相同的,但規則的語法與 GNU 版本略有不同。2絕對確定您使用
>>
的是追加而不是>
覆蓋!