linux入门系列18--Web服务之Apache服务2
接上一篇文章,在了解Apache基本配置以及SELinux相关知识后,继续演示Apache提供的虚拟主机功能以及访问控制方式。
如果还没看上一篇的建议先查看后再来,上篇文章“linux入门系列18--web服务之apache服务1”。
三、Apache虚拟主机功能
如果早期你部署过网站,相信一定知道虚拟机主机、VPS等概念,尤其是2000年前后建站非常流行,甚至诞生了很多成功的草根站长,其中有一部分网站到现在仍然做的非常成功。
网站流量的增加是一个长期累积的过程,如果每台服务器上只能运行一个网站,那些人气低、流量小的草根站长就要被迫承担着高昂的服务器租赁费用,这显然也会造成硬件资源的浪费。
为此在虚拟专用服务器(VPS:Virtual Private Server)和云计算技术诞生以前,IDC服务供应商为了更充分利用服务器资源和减低草根站长的购买门槛,都启用了虚拟主机功能。利用虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”。
虚拟主机功能也有明显的缺点,它无法像目前的云主机技术那样实现硬件资源的隔离,这些虚拟主机共同使用物理服务器的硬件资源,IDC供应商只能限制硬盘的使用空间大小,因此同一台物理主机上的不同用户的虚拟主机可能会相互影响。但是出于成本考虑,目前还是有部分个人站长采用虚拟主机的方式来部署网站。
其示意图如下:
Apache的虚拟主机功能是服务器基于用户请求的不同IP地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术。
3.1 基于IP
如果一台服务器有多个IP地址,每个IP与服务器上部署的每个网站一一对应, 这样当用户请求访问不同的IP地址时,会访问到不同网站的页面资源。
这种方式每个网站都有一个独立的IP地址,利于搜索引擎SEO优化,因此这种方式提供虚拟网站主机功能最常见且受草根站长的欢迎。
本示例IP的网站对应关系为:192.168.78.101、102、103分别对应网站1、2、3,过程如下:
3.1.1 配置多个IP
利用前面讲解的网络配置方法配置多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。
3.1.2 准备多个网站
在系统根目录下的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
3.1.3 配置Apache
配置主配置文件/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
3.2.4 测试访问
由于是继续上前文的环境下实验,前文已经设置好了防火墙和SELinux,所以直接就可以访问了,如果你遇到不能访问的情况,请参考前文检查相关设置。
注意:
(1)前边已经把/website目录添加了SELinux的上下文,因此无需把刚刚创建的子目录/website/1等进行设置。
(2)前文实验中直接通过ip可以访问/website/index.html文件,本文实验并没有删除原来的配置,只是新加了虚拟主机相关配置,可以看到,再次访问192.168.78.101这个ip是指向新的虚拟主机网站,而非原来的网站。也就是会虚拟主机配置会覆盖原来设置,优先级更高。
3.2 基于域名
当服务器无法为每个网站都分配一个独立 IP 地址的时候,可以尝试让 Apache 自动识别 用户请求的域名,从而根据不同的域名请求来传输不同的内容。
基于域名的配置与基于IP的配置,方法基本一致,只是多了一个域名和IP的映射。
3.2.0 环境准备
还是继续使用上一步的环境,把之前设置的多余的IP删除,只保留一个IP:192.168.78.101;同时将上一步3.1.3中配置的多个IP与网站的映射删除。
假设三个域名分别对应三个网站,域名分别为:test1、test2、test3.heimatengyun.com,分别对应之前的1、2、3三个网站。
3.2.1 配置域名与IP映射
可以通过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:\Windows\System32\drivers\etc\hosts文件即可。然后在宿主机就可以ping同前面的三个域名。
3.2.2 准备多个网站
由于是直接采用原来的三个网站,先修改下每个网页里边的内容,我们采用重定向往原来页面中追加对应的域名信息,方便后续验证效果。
[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
3.2.3 配置Apache
修改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配置后,需要重启服务才会生效。
3.2.4 测试访问
在宿主机浏览器输入对应的域名即可访问对应的网站。
3.3 基于端口号
基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。
相较于前二种方式,这种方式的配置要稍微复制一些,因为不仅要考虑httpd服务程序的配置,还要考虑SELinux服务对新开的端口的监控和限制。
通常情况下使用80、443、8080等端口提供网站访问服务,如果是其他端口就需要注意SELinux的现在。
3.3.0 环境准备
我们继续在上边的环境下实验,删除上一步3.2.3在配置文件中的配置。假设8111、8222、8333分别对应前面创建的1、2、3三个网站。
3.3.1 网站内准备
我们继续使用之前的三个网站,对网站内容进行修改
[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
3.3.2 Apache配置
对/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在搞鬼。
3.3.3 设置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
3.3.4 测试访问
经过以上的操作在虚拟机内容通过浏览器进行访问,可以正常通过各个端口去访问对应的网站。
但是如果在宿主机进行访问,你会发现访问不了。这无疑就是因为防火墙在搞鬼。
利于“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访问控制
Apache可以基于源主机名、源IP地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。简单说就是能控制网站让指定用户才能看到。
主要是通过访问控制指令实现,常用指令有:Allow、Deny、Order
Allow:允许某个主机访问服务器上的网站资源
Deny:实现禁止访问
Order: 定义Allow或Deny指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。
举个例子:
Order Allow, Deny:表示先将源主机与允许规则进行匹配,若匹配成功则允许访 问请求,反之则拒绝访问请求。
4.1 通过IP控制
假设我们的需求是:让前面部署的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的安装及基本用法。
linux入门系列18--Web服务之Apache服务2的更多相关文章
- linux入门系列15--文件传输之vsftp服务
前面的系列文章基本讲完了linux管理相关的基础知识,从本篇开始讲解centos7中服务程序的部署和配置,以便为外部提供各种服务. 日常工作和娱乐中,我们所需的各种资源都离不开网络以及各种服务,我们通 ...
- linux入门系列16--文件共享之Samba和NFS
前一篇文章"linux入门系列15--文件传输之vsftp服务"讲解了文件传输,本篇继续讲解文件共享相关知识. 文件共享在生活和工作中非常常见,比如同一团队中不同成员需要共同维护同 ...
- linux入门系列18--Web服务之Apache服务1
前面系列文章讲解了Linux下通过文件传输.文件共享.邮件系统来分享和获取资源,本文讲解网络资源获取和共享的另外一种形式,通过Apache服务程序来提供Web服务. 本文先讲解目前主流的Web服务程序 ...
- linux入门系列14--ssh服务及主机远程管理
通过前面十余篇文章的介绍,相信已经初步入门Linux本地管理的基本方法了,后续的文章将介绍Linux中常用的服务部署以及如何为外部提供相应的服务. 系列文章第三篇"linux入门系列3--l ...
- linux入门系列20--Web服务之LNMP架构实战
作为本入门系列最后一篇文章,将演示如何在CentOS7环境下搭建LNMP环境来构建个人博客网站. 常见搭建网站的方式有LAMP.LNMP.IIS.Nginx.Tomcat等等,本文演示比较流行的基于L ...
- linux入门系列17--邮件系统之Postfix和Dovecot
前文演示了通过Samba和NFS实现文件共享,本篇演示使用Postfix和Dovecot在局域网实现电子邮件收发系统. 电子邮件系统是我们日常生活和工作中非常重要的一个网络服务,在windows下收发 ...
- linux入门系列13--磁盘管理之RAID、LVM技术
前一篇文章学习了磁盘分区.格式化.挂载等相关知识,本文将讲解RAID和LVM技术. 磁盘管理操作主要是运维人员用的较多,如果只是单纯的开发人员,可以先略过本文.但是在很多小公司里往往都是一人多用,运维 ...
- linux入门系列5--新手必会的linux命令
上一篇文章"linux入门系列4--vi/vim编辑器"我们讨论了在linux下如何快速高效对文本文件进行编辑和管理,本文将进一步学习必须掌握的linux命令,掌握这些命令才能让计 ...
- linux入门系列12--磁盘管理之分区、格式化与挂载
前面系列文章讲解了VI编辑器.常用命令.防火墙及网络服务管理,本篇将讲解磁盘管理相关知识. 本文将会介绍大量的Linux命令,其中有一部分在"linux入门系列5--新手必会的linux命令 ...
随机推荐
- Ionic3学习笔记(十五)自定义 tab icon
本文为原创文章,转载请标明出处 美工做了一套 icon,自然是要用的.将 icon copy 到 assets 文件夹下. 例如 .icon-ios-home-custom 为 iOS icon 选中 ...
- 你还记得2017年火爆的VR街机店,这一年他们过得还好吗?
对于当下太过急于成功.一夜暴富的人们来说,似乎总是会急不可耐地去抓住每一个有可能成为大势的风口.在这份普遍存在的浮躁心理下,蕴含着极大的不确定性--既让大众认识到太多的创新产品和服务,也让很多参与者痛 ...
- 微信小程序配置二
tabBar 客户端窗口底部的tab页面切换,只能配置最好两个.最多5个tab 属性说明: 属性 类型 必填 默认值 描述 color HexColor 是 tab上的文字默认颜色 selectedC ...
- github里的readme.md
在github里如何写readme.md https://www.cnblogs.com/guchunli/p/6371040.html----------------------> READM ...
- git还原历史某一版本
返回上一版本 git reset --hard HEAD^ 常用的命令git refloggit reset --hard "填写版本号" 黄色的就是版本号 其他查看以前版本的命令 ...
- Redis list实现原理 - 双向循环链表
双向链表 双向表示每个节点知道自己的直接前驱和直接后继,每个节点需要三个域 查找方向可以是从左往右也可以是从右往左,但是要实现从右往左还需要终端节点的地址,所以通常会设计成双向的循环链表; 双向的循环 ...
- Ubuntu 18.04 国内的 apt 源
一.Ubuntu 18.04 国内的 apt 源 1. 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted univers ...
- 7-9 jmu-python-异常-学生成绩处理专业版 (25 分)
小明在帮助老师统计成绩,老师给他的是一组数据.数据的第1行代表学生数n,后面的n行代表每个学生的成绩.成绩是整数类型.小明编写了一个程序,该程序可以批量处理数据,统计所有学生的平均分.当数据没有任何错 ...
- html+css布局类型
一.单列布局 1.代码如下 <!doctype html> <html> <head> <meta charset="utf-8"/> ...
- Nginx + uWSGI部署中的一些小坑
1.invalid host in upstream报错 重新启动nginx : sudo /etc/init.d/nginx restart 原因是在配置负载均衡nginx.conf配置文件时,发现 ...