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语句,会更方便地实现访问控制。