WEB应用之httpd基础入门(三)
前文我们聊到了httpd的路径别名、访问日志定义、basic认证配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12561236.html;今天我们来聊一聊httpd的虚拟主机和状态页的配置,前边我们也提到了虚拟主机,所谓虚拟主机不外乎就是一个物理主机上存在多个虚拟站点;通常httpd的虚拟主机有三类,分别是基于ip的虚拟主机、基于端口的虚拟主机以及基于FQDN的虚拟主机;不难理解基于ip的虚拟主机就是以不同IP来区分不同的虚拟主机;基于端口的虚拟主机就是以不同端口区分不同的虚拟主机,基于fqdn的虚拟主机就是以不同用户请求报文中的host首部来区分的虚拟主机;接下来我们来看看httpd里怎么配置虚拟主机;
1、虚拟主机
httpd里虚拟主机的配置方法是由<virtualhost IP:PORT> ……</virtualhost>配置块来配置;其中httpd2.2在启用虚拟主机配置前需要将其中心主机禁用,禁用方法很简单,就是把中心主机里的documentroot指令注释即可;在httpd2.4中,我们就不需要去关闭中心主机,在配置了虚拟主机以后,中心主机自然失效,不需要人为手动注释;对于在中心主机里可配置的指令大多数都可以用于虚拟主机配置块中;用法和中心主机里配置几乎没有啥差别;
示例:基于IP的虚拟主机实现
提示:以上配置主要就是提供两个基于IP的虚拟主机,一个是192.168.0.98:80,一个是192.168.0.99:80的主机;我们在对应目录下创建好主页文件,重载配置文件,这两个虚拟主机就可以生效了;
[root@test_node1-centos7 conf.d]# echo "this is a_com page ip is 192.168.0.98" > /vhost/www/html/a_com/index.html [root@test_node1-centos7 conf.d]# echo "this is b_com page ip is 192.168.0.99" > /vhost/www/html/b_com/index.html [root@test_node1-centos7 conf.d]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:4a:bd:74 brd ff:ff:ff:ff:ff:ff inet 192.168.0.99/24 brd 192.168.0.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe4a:bd74/64 scope link valid_lft forever preferred_lft forever [root@test_node1-centos7 conf.d]# ip addr add 192.168.0.98/24 dev ens33 [root@test_node1-centos7 conf.d]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:4a:bd:74 brd ff:ff:ff:ff:ff:ff inet 192.168.0.99/24 brd 192.168.0.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.0.98/24 scope global secondary ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe4a:bd74/64 scope link valid_lft forever preferred_lft forever [root@test_node1-centos7 conf.d]# httpd -t Syntax OK [root@test_node1-centos7 conf.d]# systemctl reload httpd [root@test_node1-centos7 conf.d]#
提示:以上配置主要是给两个虚拟站点提供对应的主页文件,然后在原有的网卡上面加了一个新的ip192.168.0.98,这样配置后,我们配置的虚拟主机就可以在浏览器上通过不同的ip地址访问,得到不同的主页响应;
提示:可以看到我们以不同IP访问站点,得到的是不同虚拟主机给我们提供的主页文件,说明我们配置的基于IP地址的虚拟主机没有什么问题;同时我们也可以看这两个虚拟主机各自的访问日志文件;
提示:不同的站点,各自以不同的访问日志和错误日志分别记录着各自站点访问日志和错误日志信息;
示例:基于端口的虚拟主机实现
提示:以上配置在基于IP的虚拟主机配置上修改了下,两个虚拟主机都是基于192.168.0.99这个ip地址,分别监听在80和81两个端口上,我们访问192.168.0.99:80就会匹配到a主机,拿到a主机的主页响应,访问192.168.0.99:81就会拿到b主机的主页响应;
提示:可以看到同一IP地址,访问不同的端口,就以不同的虚拟站点提供服务;
示例:基于不同FQDN的虚拟主机实现
提示:以上配置两个虚拟主机都监听在192.168.0.99:80用户访问主要通过不同的host请求首部来区分;如下
在重载配置前,我们先在windows上坐下host解析,模拟DNS解析,分别把www.a.com 和www.b.com 都解析成192.168.0.99
提示:windows hosts解析文件在C:\Windows\system32\drivers\etc\ 名字为hosts文件,此文件语法同Linuxhosts文件语法相同,前边是ip地址 后面是主机名称或别名;如下
提示:到此我们就可以通过不同的解析名称来访问不同的虚拟站点
提示:可以看到我们以不同解析名称来访问,得到不同的虚拟主机响应,其实这中间就是用户键入不同的host首部来区分不同的虚拟站点;如下
提示:用户的host请求首部是可以是其他字串,它这个host首部是不会被解析的,通常情况下是我们在浏览器上键入什么字串,对应的host首部的值就是什么,只不过浏览器要把我们键入的字串去解析成IP然后把对应的请求发送到去对应ip地址的主机上;为了更好的理解这一过程请看下面;
提示:我们在构造请求报文时,随便给了一个字串给Host请求首部,也是可以正常请求到主页的,这就说明host请求首部实质上只是用来区分不同虚拟主机,它不用来解析;之所以在host首部没有被匹配成功的情况下,它响应a主机的页面,这是因为a主机的配置在最上面,默认情况下host首部没有被任何虚拟主机匹配就会以最上面的虚拟主机响应;这里还需要注意一点的是,httpd2.2在使用FQDN虚拟主机时,需要使用到listen指令和namevirtualhost ip:port 指令来指定虚拟主机监听的ip和端口信息;httpd2.4则可以不用使用namevirtualhost这个指令来指定;如下
提示:以上是httpd2.2基于FQDN的虚拟主机配置示例;
2、status页面配置说明
httpd的状态页面上由httpd的status_module模块实现,在配置使用状态页面信息,首先需要确认该模块是否装载,确认方法如下:
提示:httpd2.2和2.4的确认方法一样,如果能够列出status_module,说明该模块已经装载,如果没有被装载需要使用LoadModule status_module modules/mod_status.so 来装载即可;以上是httpd2.4确认结果,2.2的确认结果如下
确认了模块装载了,接下来就是配置使用
示例:httpd2.4配置status页面
提示:状态页的配置主要是用location 来指定一个URI,然后在其下面配置sethandler 指令来指定匹配到的URI怎么处理,以上表示用server-status来处理,这里需要注意一点httpd的状态页面上status_module实现的,我们在配置使用必须是server-status来处理,不能上其他名称;还需要说明的是该location可以配置在任何虚拟主机以及中心主机都可以,他都表示用server-status来处理,说白了就是显示状态页;
提示:以上就是我们刚才配置的location 对应uri 响应的内容;当然以上信息是比较私密的信息,通常情况下我们只允许部分IP地址的主机查看,在httpd2.4上如果不是允许所有主机查看,只是部分主机查看,基于IP地址做访问控制的话,我们需要将其访问控制的权限指令写到<requireall> ……</requireall>配置段中;
示例:httpd2.2状态页面配置
提示:httpd2.2和httpd2.4状态页的配置没有本质的不同;
提示:在httpd2.2的状态页上,要比httpd2.4信息少很多,从上面的提示看,它告诉我们如果要显示全面的状态信息,我们需要使用extendedstatus on指令,如果我们需要更加全面的信息,可以选择把该指定配置server配置段中;