Linux下的Apache,软件包是httpd。Httpd的主配文件是/etc/httpd/conf/httpd.conf,其配置指令主要分三部分:控制整个Apache服务器行为的部分(即全局环境变量);定义主要或默认服务参数的指令;虚拟主机的设置参数。Httpd的相关资料多如牛毛,这里就不细说了,本文实验是结合dns和apache实现虚拟主机网站的发布。
实验平台为Centos 6.2,环境为:
DNS服务器暨Apache服务器
主机名:itpro IP地址:192.168.56.53
客户端测试机
主机名:station IP地址:192.168.56.123
准备工作:
先安装DNS和Apache相应的软件,直接使用yum 安装即可,并设置开机启动
[root@itpro ~]# yum install httpd bind bind-chroot
[root@itpro ~]# chkconfig httpd on
[root@itpro ~]# chkconfig named on
[root@itpro ~]# service httpd start
[root@itpro ~]# service named start
一、先配置DNS服务器
1.配置主配文件/etc/named.conf
在options {}中,找出并修改以下三句内容:
listen-on port 53 { any; };#括号内容改为any listen-on-v6 port 53 { any; };#改为any allow-query { any; };#改为any
2.配置区域配置文件,在末尾自定义区域(这里只定义正向解析,反向解析不定义)
修改后内容如下:
[root@itpro ~]# cat /etc/named.rfc1912.zones
……省略部分内容…… zone "sq.com" IN { type master; file "sq.com.zone"; allow-update { none; }; }; zone "op.com" IN { type master; file "op.com.zone"; allow-update { none; }; };
3.在/var/named下创建数据文件op.com.zone和sq.com.zone
[root@itpro ~]# cd /var/named/
[root@itpro ~]# cp -p named.localhost op.com.zone
[root@itpro ~]# cp -p named.localhost sq.com.zone
两文件的最终内容如下(其实是一样的):
[root@itpro named]# cat op.com.zone
$TTL 1D @ IN SOA ns.sq.com. root ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS ns ns A 192.168.56.53 www A 192.168.56.53
[root@itpro named]# cat sq.com.zone
$TTL 1D @ IN SOA ns.sq.com. root ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS ns ns A 192.168.56.53 www A 192.168.56.53
[root@itpro named]# cd
[root@itpro ~]#
4.重启named服务
[root@zoro ~]# service named restart
Stopping named: . [ OK ]
Starting named: [ OK ]
二、Apache服务器配置
1.首先创建测试需要用到的主面文件,如下:
[root@luffy ~]# cd /var/www/html/
[root@itpro html]# ls
index.html op sq
[root@itpro html]# cat index.html
this is home page
server: 192.168.56.53
[root@itpro html]# cat op/index.html
this is op page
server: 192.168.56.53
[root@itpro html]# cat sq/index.html
this is sq page
server: 192.168.56.53
2.修改主配文件/etc/httpd/conf/httpd.conf
首先启用NameVirtualHost字段,该字段为一个基于域名的虚拟主机指定一个IP地址,*表示本机当前使用的IP地址。
NameVirtualHost *:80 #这一行默认是注释掉了的,要将其前面的#去掉
然后在文件末尾增加以下内容:
# ServerAdmin [email protected] DocumentRoot /var/www/html #文档的根目录。默认情况下,所有的请求从这个目录进行应答 ServerName 192.168.56.53 #机子的名称,用IP地址或域名表示 # ErrorLog logs/dummy-host.example.com-error_log #可以指定错误日志存放目录,若不指定,默认是在/etc/httpd/logs/access_log里 # CustomLog logs/dummy-host.example.com-access_log common DocumentRoot /var/www/html/op ServerName www.op.com DocumentRoot /var/www/html/sq ServerName www.sq.com
3.重启httpd服务
[root@itpro ~]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: httpd: apr_sockaddr_info_get() failed for zoro
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]
三、客户机测试
首先要将客户机的DNS指向DNS服务器192.168.56.53。
1.测试域名解析是否正常
[root@station ~]# nslookup www.op.com
Server: 192.168.56.53
Address: 192.168.56.53#53
Name: www.op.com
Address: 192.168.56.53
[root@station ~]# cat /etc/resolv.conf
nameserver 192.168.56.53
[root@station ~]# nslookup www.sq.com
Server: 192.168.56.53
Address: 192.168.56.53#53
Name: www.sq.com
Address: 192.168.56.53
以上结果无异常,表示DNS服务器正常运行。
2.测试页面访问
使用firefox访问http://192.168.56.53时,返回的结果为:
this is home page server: 192.168.56.53
使用firefox访问http://www.op.com时,返回的结果为:
this is op page server: 192.168.56.53
使用firefox访问http://www.sq.com时,返回的结果为:
this is sq page server: 192.168.56.53
四、进一步调试
1. 在服务器上将httpd的主配文件/etc/httpd/conf/httpd.conf中的NameVirtualHost注释掉(先前启用了,现在重新注释掉),然后重启httpd,再查看测试结果。
到客户机上访问站点,会发现,无论是http://192.168.56.53、http://www.op.com、还是http://www.sq.com,返回的结果都是“this is home page server: 192.168.56.53 ”,即http://192.168.56.53的主面内容。
2.在上述操作1的基础上,再将“ServerName 192.168.56.53”的虚拟主机内容删除,即虚拟主机配置内容改为:
……省略部分内容…… #NameVirtualHost *:80 ……省略部分内容……DocumentRoot /var/www/html/op ServerName www.op.com DocumentRoot /var/www/html/sq ServerName www.sq.com
修改完成后,重启httpd。
再在客户端使用浏览器访问,无论是http://192.168.56.53、http://www.op.com、还是http://www.sq.com,返回的结果都是“this is op page server: 192.168.56.53 ”,即http://www.op.com的主面内容。
3.在上述操作2的基础上,再将NameVirtualHost启用,即将httpd的主配文件/etc/httpd/conf/httpd.conf中的NameVirtualHost前的注释符#去掉,修改完成后,重启httpd。
再在客户端使用浏览器访问,访问http://192.168.56.53和http://www.op.com,返回的结果都是“this is op page server: 192.168.56.53 ”,访问http://www.sq.com返回的结果是“this is sq page server: 192.168.56.53 ”
综合以上三次操作,可以得出结论:
如果hpptd主配文件中,#NameVirtualHost *:80 被注释掉了(默认是被注释掉了的),则表示httpd的虚拟功能没有打开,此时无论在主配文件中写多少个虚拟主机(相应地,要在指定的DocumentRoot目录上建立站点页面,首页必须是index.html),最终只是第一个(写在最上面的)生效,即客户机访问所在的ServerName,最终都指向第一个ServerName对应的页面。
结论二,在启用了虚拟功能之后,主站(本文是http://192.168.56.53,对应/var/www/html/index.html),也要写入到虚拟主机里面,否则不会被访问。如操作3中,访问http://192.168.56.53时,实际上访问的不是主站,而是第一个虚拟主机http://www.op.com的页面。
五、访问控制
以上述配置文件的最后一个虚拟主机www.sq.com为例。
在虚拟主机里使用
1. 将虚拟主机配置修改为以下内容:
DocumentRoot /var/www/html/sq ServerName www.sq.com order allow,deny #先允许,后拒绝 allow from 192.168.56. #允许的内容,这里允许192.168.56.0网段来访 deny from 192.168.56.123 #拒绝的内容,这里拒绝主机192.168.56.123来访
重启httpd。
此时,IP地址为192.168.56.123的主机无法访问www.sq.com主页,出现的是Apache测试页面,在/etc/httpd/logs/access_log日志中,可以看到403报错,如下:
192.168.56.123 - - [14/May/2013:07:13:55 +0800] "GET / HTTP/1.1" 403 5039 "-" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.24) Gecko/20111104 Red Hat/3.6.24-3.el6_1 Firefox/3.6.24"
除192.168.56.123外,192.168.56.0网段内的其他主机,都可以正常访问www.sq.com主页。
2. 将虚拟主机配置修改为以下内容(与操作1相比,访问控制顺序颠倒一下):
DocumentRoot /var/www/html/sq ServerName www.sq.com order deny,allow #先拒绝,后允许 allow from 192.168.56. deny from 192.168.56.123
重启httpd。
此时,192.168.56.0网段内的所有主机,包括192.168.56.123,都可以正常访问www.sq.com主页。
3. 将虚拟主机配置修改为以下内容(与操作2相比,允许和拒绝的内容互换了一下):
DocumentRoot /var/www/html/sq ServerName www.sq.com order deny,allow #先拒绝,后允许 allow from 192.168.56.123 deny from 192.168.56.
重启httpd。
此时,IP地址为192.168.56.123的主机可以访问www.sq.com主页,除192.168.56.123外,192.168.56.0网段内的其他主机,不可以访问www.sq.com主页。
4. 将虚拟主机配置修改为以下内容(与操作3相比,访问控制顺序颠倒了;与2相比,访问控制顺序颠倒了,允许和拒绝的内容也互换了;与1相比,允许和拒绝的内容互换了):
DocumentRoot /var/www/html/sq ServerName www.sq.com order allow,deny #先允许,后拒绝 allow from 192.168.56.123 deny from 192.168.56.
此时,192.168.56.0网段内的所有主机,包括192.168.56.123,都不可以访问www.sq.com主页。
综合以上四次操作,说明了什么问题呢?头晕了,说不清楚。两两组合的问题,在实际工作中,大概不会这样写的吧,就本次实验同一网段内的需求而言,只使用deny语句、不使用allow语句,会更方便地实现访问控制。