綱要
目前 Linux 操作系統十分火爆,所以很多朋友希望了解一下 Linux 下虛擬域名的實現過程。下面就基于目前比較流行的 RedHat 來討論一下。虛擬域名的有關原理請參考《 NT 下虛擬域名的實現》一文。
目錄
DNS 服務器的設置
Apache 服務器的配置
CGI 程序的編制
DNS 服務器的設置
作 者 : 鄭濤
我們知道互聯網網是基于 TCP/IP 協議的,要進行通信必須獲得對方的 IP 地址,這是通過 DNS 服務器來實現的。因此要想實現虛擬域名首先應當令 DNS 服務器接受該虛擬域名,即把它映射到指定的 IP 地址上。因為我們靠 Web 服務器來區分域名,所以這個 IP 地址自然應當是 Web 服務器所管理的。
RedHat6.0 操作系統中捆綁有 BIND DNS 服務器。它的域名配置文件是 "/etc/named.conf" ,一般情況下,域配置文件放在 "/var/named" 目錄下面。
例 1 . named.conf 文件的配置:
zone "domain.com" {
type master;
file "domain.com";
};
zone "0.10.10.in-addr.arpa" {
type master;
file "10.10.0";
};
該例子說明 "domain.com" 的域配置文件是 "/var/named/domain.com" ,反向域的配置文件是 "/var/named/10.10.0" 。 domain.com 文件負責把 DNS 域名映射為 IP 地址。
例 2 . domain.com 文件配置:
@ IN SOA dns.domain.com. hostmaster.dns.domain.com. (
1998111003 ; serial
3600 ; refresh
900 ; retry
1209600 ; expire
43200 ; default_ttl
)
@ IN MX 10 dns.domain.com.
@ IN NS dns.domain.com.
@ IN A 10.10.0.1
www IN A 10.10.0.1
假定要增加的域名是 aaa.domain.com ,想要指到 , DNS 服務中應增加一個別名記錄,可寫成:
aaa IN CNAME .
如果需要配置大量的虛擬域名, domain.com 文件要很大,而且也相當麻煩。我們可以使用符號 "*" ,即在 domain.com 文件中加入:
* IN CNAME .
這樣它就把所有沒給出設置的以 domain.com 結尾的記錄全部轉到 去了,不管是 aaa.domain.com 還是 bbb.domain.com 。這不會影響已有的記錄。 配置好 DNS 服務器后應該重新啟動守護進程 named:
[root@domain /root]# /etc/rc.d/init.d/named restart
Apache 服務器是目前互聯網上使用最多的 Web 服務器,它可以維護非常繁忙的站點。 RedHat 6.0 捆綁了 Apache Web Server 1.3 。它的配置文件位于 "/etc/httpd/conf" 目錄下,有 httpd.conf 、 srm.conf 、 aclearcase/" target="_blank" >ccess.conf ,下面討論一下與虛擬域名有關的配置:
1 .靜態配置
修改配置文件 httpd.conf 的步驟:
(1) 首先設置 UseCanonicalName 為 off 。它指示用服務器 Host:header 的內容代替 ServerName 的值來提供給環境變量 SERVER_NAME 。
(2) 然后加入:
NameVirtualHost xxx.xxx.xxx.xxx 其中 xxx.xxx.xxx.xxx 為所要配置的虛擬服務器的 IP 地址。在此可配置多個虛擬 IP 地址,當然要與 DNS 服務器中的配置一致。(注意:這里要用 IP 地址,不能用域名。)
(3) 接下來為每個虛擬域名加入一段記錄:
< virtualhost xxx.xxx.xxx.xxx>
.....
< /virtualhost>
xxx.xxx.xxx.xxx 要和 NameVirtualHost 配置的 IP 地址一致。在兩個標志之間可加入的配置參數有:
ServerName 后面跟你要增加的虛擬域名,如 aaa.domain.com ;
Documentroot 如果你映射到本機的路徑就加在后面,如 "/home/aaa" ;
redirect 如果你映射到遠端的 URL 可加在后面,有兩個參數,第一個是虛擬域名的相對路徑,第二個是遠端站點的 URL ;
ServerAlias 后可加入本域名的別名,可使用通配符,如: *.aaa.domain.com 。
下面舉兩個例子:
例 3 .映射到本機的物理路徑:
< virtualhost xxx.xxx.xxx.xxx>
DocumentRoot "/home/test"
ServerName test.domain.com
< virtualhost>
例 4 .映射到遠端的 URL :
< virtualhost xxx.xxx.xxx.xxx>
ServerName test1.doamin.com
redirect /
< /virtualhost>
還有一些參數,象 log 文件的位置、超時的設置、緩沖區的設置等等,在此不一一介紹,可以參考 Apache 服務器的在線幫助文件。配置好 httpd.conf 文件后需要重新啟動 Apache 的后臺守護進程 httpd ,
[root@domain /root]# /etc/rc.d/init.d/httpd restart
每增加一個虛擬域名就要增加一段位于 < VirtualHost...>...< /VirtualHost> 之間的配置代碼,而且只有在重新啟動 httpd 后新配置才能生效。
2 .動態配置
可以發現,如果要配置大量的虛擬域名將大大增加配置文件的長度,這樣還會使 Apache 啟動變慢,占用更多的內存,而且也不容易實現在線申請??梢酝ㄟ^選擇動態方式來配置。這樣不必事先寫好配置,而是通過編寫一定的動態規則來自動生成或隨時從獨立的配置文件中讀取信息。
Apache 有一個強大的擴展功能,即模塊( Modules )的特性。模塊可對服務器的功能進行擴充,它在運行和使用時才裝入服務器,這樣比一直放入服務器中要節省內存空間,同時也比調用外部 CGI 程序速度快。
現在使用一個功能強大的模塊來實現動態配置虛擬域名,這就是 mod_rewrite 。它負責偵聽從客戶機送出的 URL 地址,并基于一組規則表達式對該 URL 來進行重寫。這類似于 URL 別名概念,但它更進了一步,輸出的 URL 可以映射到其他主機的任何 URL 地址上。 修改配置文件 httpd.conf 的步驟:
(1) 先設置 UseCanonicalName 為 off 。
(2) 使用 RewriteEngine on 打開 rewrite 引擎。用 RewriteMap 設定配置文件的位置和屬性,用 RewriteCond 和 RewriteRule 制定相應的規則。
例 5 . httpd.conf 文件中相關配置的一個例子:
RewriteEngine on
RewriteMap lowercase int:tolower
# 定義獨立的配置文件的位置
RewriteMap vhost dbm:/www/conf/vhostdbm
# 利用獨立的配置文件重映射虛擬域名
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/docs/$1
RewriteCond %{REQUEST_URI} ^/cgi-bin/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/cgi-bin/$1
這里的 vhostdbm 文件格式見 "CGI 程序的編制 " 。
要實現虛擬域名的在線申請,就必須編寫相應 CGI 程序動態修改獨立的配置文件(即上面的 vhostdbm 文件)和進行用戶的管理(包括用戶申請,登錄,密碼修改等等)。在此只介紹對獨立的配置文件的操作,其他屬于如何用 Perl 語言來編寫 CGI 程序,請參考有關資料。
vhostdbm 文件使用 dbm 格式來記錄數據,與用普通文本文件相比可加快尋找速度,而且易于修改。許多 UNIX 系統都具有叫做 dbm ( database management )的標準庫。該庫將鍵 - 值對的集合存貯到一對磁盤文件中,提供簡單的數據庫管理工具,可以方便的更改、新增或刪除數據內容。
Perl 訪問 dbm 的方式:通過一個類似于打開文件的進程將關聯數組與 dbm 數據庫聯系起來。在數組中創建新元素時立即就更改了 dbm 數據庫。刪除一個元素的同時也刪除了 dbm 數據庫中的數值??墒褂茫?
1 、欲將 dbm 數據庫與 dbm 數組相關聯起來:
dbmopen(%arrayname,"dbmfilename",$mode);
如果 dbmfilename 不存在的話就新建該庫。 %arrayname 參數是 Perl 的關聯數組(如果這個數組已經有值,那么這些值就被刪除)。該關聯數組連接到叫做 dbmfilename 的 dbm 數據庫中。 $mode 參數是當需要創建庫時控制庫文件權限的數字,該數字被指定為 8 進制,經常被用到的是 0644 ,給除了機主之外的新用戶以只讀的權限,機主可有全部權限。
2 、關閉 dbm 庫:
dbmclose(%arrayname);
%arrayname 是已經與 dbm 庫關聯了的數組名。
例 6 .以 VHOST 打開 vhostdbm ,或新建一個 dbm 庫:
dbmopen(%VHOST,"vhostdbm",0644);
例 7 .新建記錄或更改已有記錄(設從 html 文件 form 中傳過來的參數名為 vhost 、 rhost ):
$VHOST{$FORM{@#vhost@#}}=$FORM{@#rhost@#};
例 8 .刪除已有記錄(設從 html 文件 form 中傳過來的參數名為 vhost ):
delete $VHOST{$FORM{@#vhost@#}};
例 9 .關閉 vhostdbm :
dbmclose(%VHOST);
注:以上已經假設傳過來的參數經過了驗證,不存在重復的記錄,否則會導致已有記錄的混亂。
(作者:鄭濤)