Linux 下虚拟域名的实现

发表于:2007-07-02来源:作者:点击数: 标签:
纲要 目前 Linux 操作系统十分火爆,所以很多朋友希望了解一下 Linux 下虚拟域名的实现过程。下面就基于目前比较流行的 RedHat 来讨论一下。虚拟域名的有关原理请参考《 NT 下虚拟域名的实现》一文。 目录 DNS 服务器的设置 Apache 服务器的配置 CGI 程序的

纲要

    目前 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);

注:以上已经假设传过来的参数经过了验证,不存在重复的记录,否则会导致已有记录的混乱。
(作者:郑涛)

原文转自:http://www.ltesting.net