使用 ADSL 动态 IP 建置虚拟主机( 二 )


DocumentRoot /home/webmail/public_html
ScriptAlias /cgi-bin/ /home/webmail/public_html/cgi-bin/
# ErrorLog logs/host.some_domain.com-error_log
# CustomLog logs/host.some_domain.com-access_log common


ServerAdmin root@dyn.hn.org
ServerName imap.dyn.hn.org
DocumentRoot /var/www/html/horde/imp
# ErrorLog logs/host.some_domain.com-error_log
# CustomLog logs/host.some_domain.com-access_log common

#
################# IP-based Virtual Hosts

# User jmdault
# Group jmdault
DocumentRoot /usr/share/doc/HOWTO/translations/zh/html
ServerName RedHat.dyn.yi.org
# Setenv VLOG /home/jmdault/logs
# ErrorLogs /home/jmdault/test2-error_log
# RewriteEngine On
# RewriteOptions inherit

除此之外,我们还要把 vhosts.conf 备份(cp vhosts.conf
vhosts.conf.default)一份,否则每当程序变动虚拟主机设定文件的 IP 地址之后,下次
程序就会找不到搜寻替换的目标了 。底下是使用 PERL 变更虚拟主机设定文件之服务监听
地址的程序(dynsite.vhosts)范例:
#!/usr/bin/perl
# 拨号联机使用的适配卡
$interface = "ppp0";
# 没有联机使用的设定值
$vhosts = "172.16.0.66";
# 拨号联机使用的设定档
$filename = "/etc/httpd/conf/vhosts.conf";
# 下列程序没有必要修改
$ipconf = `/sbin/ifconfig $interface`;
$ipconf =~ /addr:(d .d .d .d )/;
$ipaddr = $1;
open (OLD_FILE,"$filename");
@lines =
close(OLD_FILE);
open (NEW_FILE,">$filename");
foreach $line (@lines) {
$line =~ s/$vhosts/$ipaddr/eg;
print NEW_FILE ("$line");
}
close (NEW_FILE);
名称服务器的情况也极为类似,每当工作排程变动虚拟主机的 IP 地址之后,网站
的服务已重新加载,您的 DNS 解析内部网络虚拟主机地址,已经与虚拟主机设定文件的
IP 地址不同,从内部网络看来,所有虚拟主机的网页又变成与主网站相同的网页了 。
怎么办?
为了内部网络与网际网络都能够正确浏览虚拟主机网页,名称服务器的设定当然也
要动态更新,底下是更新之前的内部网络名称服务器激活文件(/etc/named.conf)范例:
options {
Directory "/var/named";
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
zone "dyn.hn.org" IN {
type master;
file "named.hosts.ns";
};
zone "0.16.172.in-addr.arpa" IN {
type master;
file "named.rev.ns";
};
同样我们也要把 named.conf 档案备份(cp named.conf named.conf.default)一
份,否则每当程序变动 DNS 激活文件的反向对应区域之后,下次程序又将找不到搜寻替
换的目标了 。底下是使用 PERL 变更名称服务器激活文件反向对应区域的程序
(dynsite.bind)范例:
#!/usr/bin/perl
# 拨号联机使用的适配卡
$interface = "ppp0";
# 没有联机使用的设定值
$zone = "0.16.172.in-addr.arpa";
# 下列程序没有必要修改
$filename = "/etc/named.conf";
$ipconf = `/sbin/ifconfig $interface`;
$ipconf =~ /addr:(d .d .d .d )/;
$ipaddr = $1;
($addr1, $addr2, $addr3, $addr4)=split(/./, $ipaddr);
$ipaddr = $addr3 . "." . $addr2 . "." . $addr1 . ".in-addr.arpa";
open (OLD_FILE,"$filename");
@lines =
close(OLD_FILE);
open (NEW_FILE,">$filename");
foreach $line (@lines) {

推荐阅读