接上一篇文章,在了解Apache基本配置以及SELinux相关知识后,继续演示Apache提供的虚拟主机功能以及访问控制方式。html
若是还没看上一篇的建议先查看后再来,上篇文章“linux入门系列18--web服务之apache服务1”。linux
若是早期你部署过网站,相信必定知道虚拟机主机、VPS等概念,尤为是2000年先后建站很是流行,甚至诞生了不少成功的草根站长,其中有一部分网站到如今仍然作的很是成功。web
网站流量的增长是一个长期累积的过程,若是每台服务器上只能运行一个网站,那些人气低、流量小的草根站长就要被迫承担着高昂的服务器租赁费用,这显然也会形成硬件资源的浪费。sql
为此在虚拟专用服务器(VPS:Virtual Private Server)和云计算技术诞生之前,IDC服务供应商为了更充分利用服务器资源和减低草根站长的购买门槛,都启用了虚拟主机功能。利用虚拟主机功能,能够把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”。apache
虚拟主机功能也有明显的缺点,它没法像目前的云主机技术那样实现硬件资源的隔离,这些虚拟主机共同使用物理服务器的硬件资源,IDC供应商只能限制硬盘的使用空间大小,所以同一台物理主机上的不一样用户的虚拟主机可能会相互影响。可是出于成本考虑,目前仍是有部分我的站长采用虚拟主机的方式来部署网站。vim
其示意图以下:segmentfault
Apache的虚拟主机功能是服务器基于用户请求的不一样IP地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术。浏览器
若是一台服务器有多个IP地址,每一个IP与服务器上部署的每一个网站一一对应, 这样当用户请求访问不一样的IP地址时,会访问到不一样网站的页面资源。服务器
这种方式每一个网站都有一个独立的IP地址,利于搜索引擎SEO优化,所以这种方式提供虚拟网站主机功能最多见且受草根站长的欢迎。网络
本示例IP的网站对应关系为:192.168.78.10一、10二、103分别对应网站一、二、3,过程以下:
利用前面讲解的网络配置方法配置多IP,忘记的请返回查看“linux入门系列11--Centos7网络服务管理”。
[root@apache ~]# nmtui
中间操做过程省略,为主机配置三个IP地址,保存并退出
重启网络使其生效
[root@apache ~]# systemctl restart network [root@apache ~]# ip addr ...省略部份内容 2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:2e:3a:65 brd ff:ff:ff:ff:ff:ff inet 192.168.78.101/24 brd 192.168.78.255 scope global eno16777736 valid_lft forever preferred_lft forever inet 192.168.78.102/24 brd 192.168.78.255 scope global secondary eno16777736 valid_lft forever preferred_lft forever inet 192.168.78.103/24 brd 192.168.78.255 scope global secondary eno16777736 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe2e:3a65/64 scope link valid_lft forever preferred_lft forever [root@apache ~]#
确保经过ip addr命令能够看到刚才配置的IP,并能在虚拟机或宿主机上能ping通刚才配置的每一个IP。
在系统根目录下的website目录下建立3个目录,并分别建立不一样的页面文件。
[root@apache website]# mkdir -p /website/1 [root@apache website]# mkdir -p /website/2 [root@apache website]# mkdir -p /website/3 [root@apache website]# echo "192.168.78.101">/website/1/index.html [root@apache website]# echo "192.168.78.102">/website/2/index.html [root@apache website]# echo "192.168.78.103">/website/3/index.html
配置主配置文件/etc/httpd/conf/httpd.conf
[root@apache website]# vim /etc/httpd/conf/httpd.conf ...省略部份内容 <VirtualHost 192.168.78.101> DocumentRoot /website/1 ServerName website1 <Directory /website/1> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.78.102> DocumentRoot /website/2 ServerName website2 <Directory /website/2> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.78.103> DocumentRoot /website/3 ServerName website3 <Directory /website/3> AllowOverride None Require all granted </Directory> </VirtualHost> ...省略部份内容
添加以下配置,并保存退出
重启httpd使其生效。
[root@apache website]# systemctl restart httpd
因为是继续上前文的环境下实验,前文已经设置好了防火墙和SELinux,因此直接就能够访问了,若是你遇到不能访问的状况,请参考前文检查相关设置。
注意:
(1)前边已经把/website目录添加了SELinux的上下文,所以无需把刚刚建立的子目录/website/1等进行设置。
(2)前文实验中直接经过ip能够访问/website/index.html文件,本文实验并无删除原来的配置,只是新加了虚拟主机相关配置,能够看到,再次访问192.168.78.101这个ip是指向新的虚拟主机网站,而非原来的网站。也就是会虚拟主机配置会覆盖原来设置,优先级更高。
当服务器没法为每一个网站都分配一个独立 IP 地址的时候,能够尝试让 Apache 自动识别 用户请求的域名,从而根据不一样的域名请求来传输不一样的内容。
基于域名的配置与基于IP的配置,方法基本一致,只是多了一个域名和IP的映射。
仍是继续使用上一步的环境,把以前设置的多余的IP删除,只保留一个IP:192.168.78.101;同时将上一步3.1.3中配置的多个IP与网站的映射删除。
假设三个域名分别对应三个网站,域名分别为:test一、test二、test3.heimatengyun.com,分别对应以前的一、二、3三个网站。
能够经过DNS解析服务进行配置,本处直接修改/etc/hosts文件,在该文件中指定IP与域名之间的映射关系。/etc/hosts是Linux系统中用于强制把某个主机域名解析到指定IP地址的配置文件。
[root@apache website]# vim /etc/hosts 192.168.78.101 test1.heimatengyun.com test2.heimatengyun.com test3.heimatengyun.com
在文件末尾添加以上内容保存并退出。
在虚拟机中确保能够ping同以上各个域名。
[root@apache website]# ping -c 1 test1.heimatengyun.com PING test1.heimatengyun.com (192.168.78.101) 56(84) bytes of data. 64 bytes from test1.heimatengyun.com (192.168.78.101): icmp_seq=1 ttl=64 time=0.033 ms --- test1.heimatengyun.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.033/0.033/0.033/0.000 ms [root@apache website]#
这样等后续操做完成后就能够在虚拟机内部经过域名进行访问。
可是若是想让宿主机也能进行访问的话,须要在宿主机中也要添加IP与域名的映射。因为个人宿主机为win10,所以将以上IP与域名的映射内容添加到C:WindowsSystem32driversetchosts文件便可。而后在宿主机就能够ping同前面的三个域名。
因为是直接采用原来的三个网站,先修改下每一个网页里边的内容,咱们采用重定向往原来页面中追加对应的域名信息,方便后续验证效果。
[root@apache website]# echo "test1.heimatengyun.com">>/website/1/index.html [root@apache website]# echo "test2.heimatengyun.com">>/website/2/index.html [root@apache website]# echo "test3.heimatengyun.com">>/website/3/index.html
修改Apache主配置文件,/etc/httpd/conf/httpd.conf
[root@apache website]# vim /etc/httpd/conf/httpd.conf ...省略部份内容 <VirtualHost 192.168.78.101> DocumentRoot /website/1 ServerName test1.heimatengyun.com <Directory /website/1> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.78.101> DocumentRoot /website/2 ServerName test2.heimatengyun.com <Directory /website/2> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.78.101> DocumentRoot /website/3 ServerName test3.heimatengyun.com <Directory /website/3> AllowOverride None Require all granted </Directory> </VirtualHost> ...省略部份内容
在配置文件中添加上述内容并保存退出。
注意:此处能够对比以前的IP配置,配置参数都是基本同样的,惟一的不一样是以前每一个网站对应不一样IP,如今是都写同一个IP。能够自行对比
修改完成后重启Apache,使其生效。
[root@apache website]# systemctl restart httpd
注意:修改Apache配置后,须要重启服务才会生效。
在宿主机浏览器输入对应的域名便可访问对应的网站。
基于端口号的虚拟主机功能可让用户经过指定的端口号来访问服务器上的网站资源。
相较于前二种方式,这种方式的配置要稍微复制一些,由于不只要考虑httpd服务程序的配置,还要考虑SELinux服务对新开的端口的监控和限制。
一般状况下使用80、44三、8080等端口提供网站访问服务,若是是其余端口就须要注意SELinux的如今。
咱们继续在上边的环境下实验,删除上一步3.2.3在配置文件中的配置。假设81十一、822二、8333分别对应前面建立的一、二、3三个网站。
咱们继续使用以前的三个网站,对网站内容进行修改
[root@apache website]# echo "8111">>/website/1/index.html [root@apache website]# echo "8222">>/website/2/index.html [root@apache website]# echo "8333">>/website/3/index.html
对/etc/httpd/conf/httpd.conf进行配置,使其支持多端口监听
(1)在大概43行左右,添加端口监听
[root@apache website]# vim /etc/httpd/conf/httpd.conf ...省略部份内容 Listen 8111 Listen 8222 Listen 8333 ...省略部份内容
继续下边的修改
(2)在大概120行左右,追加基于端口号的虚拟主机参数配置
<VirtualHost 192.168.78.101:8111> DocumentRoot /website/1 ServerName test1.heimatengyun.com <Directory /website/1> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.78.101:8222> DocumentRoot /website/2 ServerName test2.heimatengyun.com <Directory /website/2> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.78.101:8333> DocumentRoot /website/3 ServerName test3.heimatengyun.com <Directory /website/3> AllowOverride None Require all granted </Directory> </VirtualHost> ...省略部份内容
保存退出
与3.2.3相对,没有太大变化,只是在IP后添加端口便可,几种配置方法都大同小异。
重启apache使其生效
[root@apache website]# systemctl restart httpd Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. [root@apache website]# journalctl -xn ...省略部份内容 ***** Plugin bind_ports (92.2 confidence) suggests If you want to allow /usr/sbin/httpd to bind to network port 8111 Then you need to modify the port type. Do # semanage port -a -t PORT_TYPE -p tcp 8111 ...省略部份内容
可是你会发现,重启失败。若是你查看日志,会发现这样的提示内容,别担忧,这正是刚开始提到的SELinux在搞鬼。
查看目前默认的SELinux容许的与HTTP协议相关的端口
[root@apache website]# semanage port -l | grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989 [root@apache website]#
因而咱们要把刚才新加的三个端口添加进入
[root@apache website]# semanage port -a -t http_port_t -p tcp 8111 [root@apache website]# semanage port -a -t http_port_t -p tcp 8222 [root@apache website]# semanage port -a -t http_port_t -p tcp 8333
添加完成重启apache
[root@apache website]# systemctl restart httpd
通过以上的操做在虚拟机内容经过浏览器进行访问,能够正常经过各个端口去访问对应的网站。
可是若是在宿主机进行访问,你会发现访问不了。这无疑就是由于防火墙在搞鬼。
利于“linux入门系列10--firewalld防火墙管理”讲解的知识,将这3个对应的端口放行便可。
[root@apache website]# firewall-cmd --zone=public --list-ports [root@apache website]# firewall-cmd --zone=public --add-port=8111/tcp success [root@apache website]# firewall-cmd --zone=public --add-port=8222/tcp success [root@apache website]# firewall-cmd --zone=public --add-port=8333/tcp
此时,再次在宿主机进行访问,就能够正常访问了。
细心的你可能会发现,若是是按照上边的步骤一路下来的话,你会发现如今实际上是3种方式都开启的。分别经过不一样的端口去访问,能够正常访问到对应的不一样网站。可是经过若是你经过ip或域名再去访问的话,你会发现通通都指向前一篇文章中案例1指向的网页。为何会这样呢?那是由于以前案例没有显式指定端口,默认的端口为80。所以若是没显式指定端口,默认是去web的80端口的。
Apache能够基于源主机名、源IP地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。简单说就是能控制网站让指定用户才能看到。
主要是经过访问控制指令实现,经常使用指令有:Allow、Deny、Order
Allow:容许某个主机访问服务器上的网站资源
Deny:实现禁止访问
Order: 定义Allow或Deny指令起做用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。
举个例子:
Order Allow, Deny:表示先将源主机与容许规则进行匹配,若匹配成功则容许访 问请求,反之则拒绝访问请求。
假设咱们的需求是:让前面部署的1网站只容许虚拟机内部进行访问,禁止外部机器访问。
[root@apache website]# vim /etc/httpd/conf/httpd.conf ...省略部份内容 <VirtualHost 192.168.78.101:8111> DocumentRoot /website/1 ServerName test1.heimatengyun.com <Directory /website/1> AllowOverride None Require all granted Order allow,deny Allow from 192.168.78.101 </Directory> </VirtualHost> ...省略部份内容
咱们只须要打开主配置文件,在添加Order allow,deny和Allow from 192.168.78.101便可实现。配置以后,重启apache,发如今虚拟机里能够正常访问,可是在宿主机已经不能访问了此网站了(直接跳转到测试页面)。
除此以外还能够经过浏览器特征来限制指定浏览器进行访问,再此就不进行演示了。
下一篇文章将演示Mysql数据的兄弟-MariaDB的安装及基本用法。