目前WWW Server软件有许多,能运行在linux下的也不少,有NCSA HTTPd Server、CERN HTTPd Server、Apache、Netscape Fast Track Server、Zeus Server等。这些软件各有特色:NCSA(美国伊利诺斯大学的国家超级计算应用中心)是WWW Browser Mosaic发迹之地,也是Netscape公司的安德森成名的地方;CERN(欧洲原子核研究中心)是WWW的起源地,1989年蒂姆·贝纳斯-李正是在这里成功开发了世界上第一个Web服务器和客户机。这两家推出的WWW Server功能齐全,成为同类软件的标准,再加上它们都是Freeware,因此刚一推出就大受欢迎。前几年,在linux下WWW Server软件使用最多的是NCSA和CERN,但这一两年,后起之秀Apache却独领风骚,号称“WWW Server之王”。在最新的Red Hat、Slackware和OpenLinux各版本中都包含了Apache。
Apache是在NCSA的基础上发展起来的,因此二者的配置文件十分相似。Red hat 5.2自带的是Apache 1.3。
一、安装
Apache的安装十分简单。最好在安装red hat时,选择安装web server,这样即使你对编译操作不熟的话,也能轻轻松松把服务器架设起来。
如果你想亲自编译源文件,那么你已经不是一个初学者,建议你直接去看howto文档或其它资料。
打开机器,进入X-Window系统后,启动Netscape Navigator,敲入本机的IP地址,如果出现“It worked”的欢迎页面如右图,那说明服务器程序工作正常,你可以进行下一步配置工作。
在不同的版本下,服务器默认的工作根目录也不一样。Red Hat默认的是/etc/httpd,配置文件在/etc/httpd/conf目录下,页面文件在/home/httpd目录下。
二、设置httpd.conf、srm.conf、access.comf
Apache安装成功后,在conf子目录下有四个文件:httpd.conf、srm.conf、access.conf、magic(注意:在www-howto文档中,说第四个文件是mime.types,但在实际安装中,在conf子目录下是magic文件)。httpd.conf是Apache设置文件中的主文件,httpd程序启动时会先读取httpd.conf;srm.conf是数据配置文件,在这个文件中主要设置WWW Server读取文件的目录、目录索引时的画面、CGI执行时的目录等等;access.conf是负责基本的读取文件控制,限制目录所能执行的功能及访问目录的权限设置。
下面将简单对这三个数据设置文件进行说明。
1、httpd.conf
TransferLog:如果你想知道你的网站上哪个页面最受欢迎,在一段时间内有多少人访问你的站点,你可以设置一个计数器,但每页都设计数器,太繁琐而且得到的结果不太可靠。最好的办法是查看相应log文件,TransferLog命令就是指定当浏览器要求服务器传送文件时记录到所设置的文件,可以根据此文件查看有哪些用户看过哪些HTML文件。可用一些程序分析这个文件的数据,得出各种有用的监测数据。默认的访问log文件是logs/access_log。
ErrorLog:这个命令是指定当WWW Server运转过程中发生问题时错误信息存放到的文件。默认是logs/error_log。
VirtualHost:这个命令是用来设置虚拟主机,即用一台主机执行多个域名的WWW Server。详细命令使用将在第三部分详细解释。
2、srm.conf
DocumentRoot:指定WWW Server存放html文件的根目录。WWW Server从硬盘中读取html文件传送给浏览器,并不是可从任一个目录中读取文件,而是从一个特定目录中开始读取文件,这个特定的目录就是由DocumentRoot命令来指定。red hat 5.2中默认的目录是/home/httpd/html。
如果用户访问http://www.pcdigest.com/netlife/index.html,此时WWW Server并不是从系统的根目录下的netlife目录中读取index.html,而是从/home/httpd/html/netlife目录中读取index.html文件。
UserDir:如果要在WWW Server上给一些用户开设空间,搁放个人主页,最好不要把每个人的html文件都放到DocumentRoot目录中,用UserDir命令可让每个人的页面放置在自己的home目录中。默认的目录是public_html。
如果UserDir设置的目录是public_html,而Username是yan,而该user的home目录是/home/yan,那你访问http://www.pcdigest.com/~yan/intr.html时所看到的intr.html文件存放在/home/yan/public_html中,而不是/home/httpd/html。
3、access.conf
如果你有些目录只想让某些人访问,或者只允许在特定的目录下允许CGI程序,这时就要对access.conf进行修改。
Apache的存取控制方式有两种:一是“整体存取控制”,只通过access.conf来控制文件的设置,来限定目录所能执行的功能及存取目录的权限设置。二是“特定目录存取控制”,在特定目录中建立存取设置文件,这个文件名在srm.conf中的AcessFileName来决定,默认是.htaccess。例如某些目录中的文件只允许某些人访问,那可在该目录下建立.htaccess文件,当WWW Server读取该目录时便会自动读取.htaccess来决定是否读取执行或要求口令验证。这两种方式所使用的命令几乎相同,而且设置的格式也相同。
Directory:说明要设置的目录,然后再用命令来设置目录的功能和权限。
Options:设置目录可以执行哪些功能。有None、All、ExecCGI、Includes、Indexs、IncludesNoExec、FollowSymlink、SymlinksOwnerMatch等选项。如果想让某个目录可以执行CGI程序,那么应在Options命令中加上ExecCGI选项。
Require:设置可以对所指定目录以指定方式来存取的Users和Group。该命令执行后,当读取该目录数据时,系统会要求输入Username和Password。
忠告:修改完设置文件后,不要像在Windows工作那样,重启机器使其生效。要记住,你现在linux下,使用linux的好处之一就是不用再见到Windows 98那死机时的蓝屏以及不必对配置文件做了一点点修改就无聊而又频繁地重启机器。你的WWW服务器任何时候都有很多人在访问,频繁地重启机器将把你的客人吓跑。要学会不重启机器,而是重新启动一个正执行的程序(Process,严格一点应叫做进程、作业)。可以用kill命令来使程序重新启动。具体kill的使用参见有关文档。
先用ps命令查看httpd的pid号,然后用kill命令杀死它,重新启动httpd。具体命令如下:
linux〉ps -x
linux〉kill -HUP 13668(13668是假设httpd的pid号,在实际使用中,不同的情况值也不同)
这样就可将httpd重新启动,使修改的配置文件生效。
看完上面一大堆命令,是不是有些烦,其实你不了解这些命令也无所谓,用系统默认设置也能正常工作。
三、虚拟主机(Virtual Host)的设置
作为系统管理员,若你只有一个IP地址,却有好几个域名,又要求访问每个域名都要看到不同的内容,那怎么办?总不至于为每个域名都配上一台服务器吧。这就要采用虚拟主机(Virtual Host)技术,幸好Apache就支持这种功能。虚拟主机有两种方式:IP-Based(基于IP式)、Name-based(基于域名式)。IP-Based指的是一个域名对应一个IP地址,而Name-based指的是多个域名对应一个IP地址。
虚拟主机的设置并不复杂,只要在httpd.conf文件中加入相应的命令就行。
下面是一个Name-based(基于域名式)虚拟主机的httpd.conf例子IP为:192.9.188.20,两个域名分别是long.com.cn、short.com.cn。
httpd.conf:
NameVirtualHost 192.9.188.20
〈VirtualHost www.long.com〉
ServerAdmin webmaster@long.com
ServerName www.long.com
DocumentRoot /home/httpd/long/html
ErrorLog logs/error_log
TransferLog logs/access_log
〈/VirtualHost〉
〈VirtualHost www.short.com〉
ServerAdmin webmaster@short.com
ServerName www.short.com
DocumentRoot /home/httpd/short/html
ErrorLog logs/short.com-error_log
TransferLog logs/short.com-access_log
〈/VirtualHost〉
NameVirtualHost命令指定在哪个IP上设置虚拟主机。
在VirtualHost命令中进行各个主机的具体设置。
ServerAdmin命令是设定当WWW Server执行有问题时,会将ServerAdmin所设置的E-mail传送到浏览器,让使用者用该E-mail与系统管理员联系。
ServerName命令是设置WWW Server的域名。
四、提供个人主页空间、用户homepage的设定
经常见到某些网站提供个人主页,显得很神气,其实你也可以开放你机器上的空间给别人,这实现起来很简单。只要你按照下面的提示对你的WWW服务器配置文件进行修改。
给用户开放个人主页空间,一是要确定用户主页的存放目录,二是开放用户主页目录的读取权限。
方法一:你以root的身份给用户chen开个帐号,系统自动会给chen分配一空间/home/user,而后在/home/chen的目录下建一public_html的子目录,子目录的属性要设成other可读和可执行的。
接着修改access.conf,在文件的最后加上以下一段:
〈Directory /home/chen/public_html〉
AllowOverride None
order allow,deny
allow from all
〈/Directory〉
而后,重新运行httpd,用户就可以通过http://www.pcdigest.com/~chen/访问chen的个人主页。
这种方法的优点是方便,缺点是安全性太差。
方法二:另一种办法是在/home/httpd目录下为用户chen建个目录chen。修改srm.conf中的UserDir为/home/httpd/*/html,接着重新运行httpd便可以了。
Linux循序渐进(14):进程调度
(05/10/2000)
第十三课 进程调度
kill命令
当需要中断一个前台进程的时候,通常是使用组合键;但是对于一个后台进程恐怕就不是一个组合键所能解决的了,这时就必须求助于kill命令。该命令可以终止后台进程。至于终止后台进程的原因很多,或许是该进程占用的CPU时间过多;或许是该进程已经挂死。总之这种情况是经常发生的。
kill命令是通过向进程发送指定的信号来结束进程的。如果没有指定发送信号,那么默认值为TERM信号。TERM信号将终止所有不能捕获该信号的进程。至于那些可以捕获该信号的进程可能就需要使用kill(9)信号了,该信号是不能被捕捉的。
kill命令的语法格式很简单,大致有以下两种方式:
kill [-s 信号 | -p ] [ -a ] 进程号 ...
kill -l [信号]
-s 指定需要送出的信号。既可以是信号名也可以对应数字。
-p 指定kill命令只是显示进程的pid,并不真正送出结束信号。
-l 显示信号名称列表,这也可以在/usr/include/linux/signal.h文件中找到。
kill命令的使用
下面看看该命令的使用。
[例24] 在执行一条find指令时由于时间过长,决定终止该进程。
首先应该使用ps命令来查看该进程对应的PID,键入ps,显示如下:
PID TTY TIME COMMAND
285 1 00:00:00 -bash
287 3 00:00:00 -bash
289 5 00:00:00 /sbin/mingetty tty5
290 6 00:00:00 /sbin/mingetty tty6
312 3 00:00:00 telnet bbs3
341 4 00:00:00 /sbin/mingetty tty4
345 1 00:00:00 find / -name foxy.jpg
348 1 00:00:00 ps
可以看到该进程对应的PID是345,现在使用kill命令来终止该进程。键入:
# kill 345
再用ps命令查看,就可以看到,find进程已经被杀掉了。
[例25] 杀掉进程11721
# ps
PID TTY TIME COMMAND
11668 p1 00:00:00 -tcsh
11721 p1 00:00:00 cat
11737 p1 00:00:00 ps
# kill 11721
[1] Terminated cat
#
有时候可能会遇到这样的情况,某个进程已经挂死或闲置,使用kill命令却杀不掉。这时候就必须发送信号9,强行关闭此进程。当然这种“野蛮”的方法很可能会导致打开的文件出现错误或者数据丢失之类的错误。所以不到万不得已不要使用强制结束的办法。如果连信号9都不响应,那恐怕就只有重新启动计算机了。
控制多个进程命令
Linux可使用户同时运行多个进程,还允许用户或系统管理员能控制正在运行的进程。
nohup命令
理论上,我们一般退出Linux系统时,会把所有的程序全部结束掉,包括那些后台程序。但有时候,例如您正在编辑一个很长的程序,但是您下班或是有事需要先退出系统,这时您又不希望系统把您编辑那么久的程序结束掉,希望退出系统时,程序还能继续执行。这时,我们就可以使用nohup命令使进程在用户退出后仍继续执行。
一般这些进程我们都是让它在后台执行,结果则会写到用户自己的目录下的nohup.out这个文件里(也可以使用输出重定向,让它输出到一个特定的文件)。[例26]
$ nohup sort sales.dat &
这条命令告诉sort命令忽略用户已退出系统,它应该一直运行,直到进程完成。利用这种方法,可以启动一个要运行几天甚至几周的进程,而且在它运行时,用户不需要去登录。
nohup命令把一条命令的所有输出和错误信息送到nohup.out文件中。若将输出重定向,则只有错误信息放在nohup.out文件中。
renice命令
renice命令允许用户修改一个正在运行进程的优先权。
利用renice命令可以在命令执行时调整其优先权。其格式如下:
$ renice -number PID
其中,参数number与nice命令的number意义相同。
注:
(1) 用户只能对自己所有的进程使用renice命令。
(2) root用户可以在任何进程上使用renice命令。
(3) 只有root用户才能提高进程的优先权。
思 考 题
1. 什么是进程?进程与作业有何区别?
2. 进程启动的方式有哪几种?
3. at命令与batch命令有何本质区别?
4. cron命令在何时执行?如何改变其执行状态?
5. 何谓前台作业、后台作业?如何挂起当前的前台作业?如果要恢复其运行又如何做?
6. 进程的查看命令有哪些?各有什么不同?
7. 如何中断一个后台进程?
8. 如何在用户退出Linux系统时,使一个进程仍然能继续执行?
9. 如何修改一个作业的优先权?
10. 编写和检验完成下列各项功能的命令管道行:
(1)显示当前系统中的登录名的数目。
(2)显示当前系统中有多少个进程。
11. 说明下列管道行分别完成什么功能:
(1)df -a | wc -l
(2)who | wc
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 ,想要指到 www.domain.com , DNS
服务中应增加一个别名记录,可写成:
aaa IN CNAME www.domain.com.
如果需要配置大量的虚拟域名, domain.com 文件要很大,而且也相当麻烦。我们可以使用符号
"*" ,即在 domain.com 文件中加入:
* IN CNAME www.domain.com.
这样它就把所有没给出设置的以 domain.com 结尾的记录全部转到 www.domain.com
去了,不管是 aaa.domain.com 还是 bbb.domain.com 。这不会影响已有的记录。
配置好 DNS 服务器后应该重新启动守护进程 named:
[root@domain /root]# /etc/rc.d/init.d/named restart
Apache 服务器的配置
作 者 : 郑涛
Apache 服务器是目前互联网上使用最多的 Web 服务器,它可以维护非常繁忙的站点。 RedHat 6.0 捆绑了 Apache Web Server 1.3 。它的配置文件位于 "/etc/httpd/conf" 目录下,有 httpd.conf 、 srm.conf 、 access.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 / http://test.domain1.com/welcome.htm
< /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 程序的编制
作 者 : 郑涛
要实现虚拟域名的在线申请,就必须编写相应 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);
注:以上已经假设传过来的参数经过了验证,不存在重复的记录,否则会导致已有记录的混乱。
NT 下虚拟域名的实现
作 者 : 郑涛
虚拟域名实际上是虚拟主机的一种。
虚拟主机的出现是为了节省硬件的投资。如果 ISP 为每个申请了域名的用户都使用一台单独的机器,显然费用会很高,而且对于访问不是很频繁的站点来说也是一种浪费。所以就出现了大家公用一台机器,但每个用户之间相互独立,功能完全等同与拥有自己的主机。
虚拟主机分为基于 IP 地址的( IP-based )和基于名称的( name-based )两种。
基于 IP 地址的虚拟主机大家虽然在同一台机器上,还是要给每个域名配置独立的 IP 地址,这样看来还不能算是一种很理想的方案。有没有用一台机器、一个 IP 地址,又能实现独立的域名呢?
这个想法随着 http/1.1 协议的出现得到了实现。它的原理是用 Web 服务器和浏览器共同作用来实现把虚拟的域名与相应的目录或站点对应。这样用户在浏览器里输入不同的名字,虽然由 DNS 服务器解析出的是同一个 IP ,但得到的却是不同的内容。看上去就象两个独立的域名了。所以这种基于名称的虚拟主机又称为非 IP 的( non-IP )。这同时还有一个用处,可以给很长的 URL 起一个即好记又有意义的别名。这就是虚拟域名。
实现虚拟域名要有两方面的支持:
一是 Web 服务器:
现在有很多的 Web Server 支持基于名称的虚拟主机。象 Netscape , IIS 等都支持。当然用的最多的还是 Apache Web Server ,究其原因是因为它配置方便,还是免费的,而且它是第一个实现了基于名称的虚拟主机的服务器产品。
二是用户的浏览器:
我想大家使用的决大多数应该是 3.0 版本以上的 IE 或 Netscape ,那就没问题了,它们都支持。
下面我们就来看看在 NT 下如何实现虚拟域名:
第一步是要 DNS 服务器认识你要增加的域名,也就是把它解释成相应的 IP 地址。因为我们要靠 Web 服务器来区分域名,所以这个 IP 地址自然得是你 Web Server 所管理的了。
你所要做的就是 DNS 服务中增加一个别名记录,假定你要增加的是 aaa.domain.com ,想要指到 www.domain.com ,就可写成:
aaa IN CNAME www.domain.com.
也许你会想如果我要增加很多域名,那不是很麻烦,而且 DNS 服务器的记录文件要很大喽。好,我们来骗一下 DNS 服务器,把“ aaa ”改成“ * ”,这样它就把所有没给出设置的以 domain.com 结尾的记录全部转到 www.domain.com 去了,不管是 aaa.domain.com 还是 bbb.domain.com 。这不会影响已有的记录。
下一步就要配置 Web 服务器了。我们选两个常用的: IIS 和 Apache for NT 。
一、 IIS (记住,只有 4.0 版以上才支持基于名称的虚拟主机。)
进入 IIS 的服务管理器,在相应的服务器上选择新增 Web 站点,给站点起个名字,选择好 IP 地址(也就是前面设好的由 DNS 服务器所指向的)。选择好主目录路径,如果是映射到远端的 URL 的话,可以先设个临时的路径。
完成后进入新建的 Web 站点的属性,在“ Web 站点”的标签里点“高级 ... ”按钮,编辑标识记录,在“主机标题名”处填写要加入的虚拟域名,如: aaa.domain.com ,记住要填完整,不能光打 aaa 。现在可以到“主目录”的标签里选择要映射的具体目录了,可以是本机器或本网机器上的路径,也可是远端站点的 URL 。
IIS 配置起来直观,但如果是有大量的记录就不适合了,而且也不适合在线申请。
二、 Apache (新版本已经开始支持 NT ,你可以到 http://www.apache.org 去得到最新的版本,并且带源代码,有兴趣可以自己开发些新功能)
配置 Apache 需要跟配置文件 http.conf 打交道,缺省情况它位于 /Program Files/Apache Group/Apache/conf 目录下。
首先需要加入 NameVirtualHost xxx.xxx.xxx.xxx
其中 xxx.xxx.xxx.xxx 为你虚拟服务器的 IP 地址,也就是上面例子 www.domain.com 的 IP 地址。在此可配置多个虚拟 IP 地址。(注意:这里要用 IP 地址,不要用域名)
接下来为每个虚拟域名加入记录: …… xxx.xxx.xxx.xxx 要和 NameVirtualHost
的一致。 在两个标志之间可加入的配置参数有:
ServerName 后面跟你要增加的虚拟域名,如 aaa.domain.com ;
Documentroot 如果你映射到本机的路径就加在后面,如“ F:/html/aaa
”(需要加双引号);
redirect 如果你映射到远端的 URL 可加在后面,有两个参数,第一个是虚拟域名的相对路径,第二个是远端站点的
URL ;
ServerAlias 后可加入本域名的别名,可使用通配符,如:
*.aaa.domain.com 。
下面举几个例子:
1. 映射到本机的物理路径:
< VirtualHost xxx.xxx.xxx.xxx>
DocumentRoot "F:/Program Files/Apache Group/Apache/htdocs/test"
ServerName test.domain.com
< VirtualHost>
2. 映射到远端的 URL :
< VirtualHost xxx.xxx.xxx.xxx>
ServerName test1.doamin.com
redirect / http://test.domain1.com/welcome.htm
< /VirtualHost>
当然还有许多参数,象 log 文件的位置、超时的设置、缓冲区的设置等等,可以参考 Apache 的在线帮助文件。每增加一个虚拟域名就要增加一段位于 < VirtualHost...>...< /VirtualHost> 之间的配置代码,而且只有在重新启动 Apache 后新配置才能生效。
显然如果要配置大量的记录将大大增加配置文件的长度,这样会还会使 Apache
启动变慢,占用更多的内存,而且也不容易实现在线申请。你可以通过选择动态方式来配置虚拟主机。这样你不必事先写好配置,而是通过编写一定的动态规则来自动生成或随时从独立的配置文件中读取信息。这要用到
Apache 的 mod_rewrite 模块,所以要在配置文件里加一行:
LoadModule rewrite_module modules/ApacheModuleRewrite.dll
你可以制定很多规则来重写 URL ,象通过环境变量、 http 协议头,甚至是通过外部的数据库来维护 URL 。它的功能非常强大,也就同时带来了复杂性,你得通过不断的摸索和实验来真正掌握它,不过这是很值得的。
最后简单的介绍一下在线免费域名的一种实现:
1. 通过 Perl 来维护一个用户数据库,管理用户的增删、验证和密码更改等工作。
2. 同时用 Perl 来通过数据库维护独立的虚拟域名的配置文件,例如: vdomains.map ,格式如下:
aaa.domain.com http://www.domain1.com/~aaa
bbb.domain.com http://www.domain2.com/~bbb ...
3. 最后配置 httpd.conf 文件。
用 RewriteEngine On 打开 rewrite 模块,用 RewriteMap 设定配置文件的位置和属性,用
RewriteCond 和 RewriteRule 制定相应的规则即可。