第10章:使用Apache服务部署静态网站
本章导学:什么是Web服务程序?Web服务程序有什么用处?常见Web服务程序的优劣势对比;httpd服务程序的使用;学习SELinux服务;个人用户主页功能;虚拟主机功能;Apache的访问控制。
一、网站服务程序
1、Web服务程序背景
1970 年,作为互联网前身的 ARPANET(阿帕网)已初具雏形,并开始向非军用部门开放,许多大学和商业部门开始接入。
2、什么是Web服务程序?
平时访问的网站服务就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务。
Web 网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的请求后才会响应,最终用于提供服务程序的 Web 服务器会通过 HTTP(超文本传输协议)或HTTPS(安全超文本传输协议)把请求的内容传送给用户。
3、常见的Web服务程序有哪些?
提供 Web 网络服务的程序有 IIS、Nginx 和 Apache 等。
其中 IIS(Internet Information Services,互联网信息服务)是 Windows 系统中默认的 Web 服务程序,IIS 只能在 Windows 系统中使用,因此它不在我们的讨论范围内。
2004 年 10 月 4 日,为俄罗斯知名门户站点而开发的 Web 服务程序 Nginx 横空出世。Nginx 程序作为一款轻量级的网站服务软件,因其稳定性和丰富的功能而快速占领服务器市场,但 Nginx 最被认可的还当是系统资源消耗低且并发能力强,因此得到了国内诸如新浪、网易、腾讯等门户站的青睐。
Apache 程序是目前拥有很高市场占有率的 Web 服务程序之一,其跨平台和安全性广泛被认可且拥有快速、可靠、简单的 API 扩展。Apache 服务程序可以运行在 Linux 系统、UNIX 系统甚至是 Windows 系统中,支持基于IP、域名及端口号的虚拟主机功能,支持多种认证方式,集成有代理服务器模块、安全Socket 层(SSL),能够实时监视服务状态与定制日志消息,并有着各类丰富的模块支持。Apache是RHEL5、6、7系统中默认的Web服务程序。
4、安装并初步使用 Apache
1)首先把CentOS-7-x86_64-DVD-1810.iso镜像文件所在设备/dev/cdrom挂载到系统目录/media/cdrom下。
mkdir -p /media/cdrom
mount /dev/cdrom /media/cdrom
2)编辑Yum仓库的配置文件
vim /etc/yum.repos.d/rhel7.repo
[rhel7]
name=rhel7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0
3)手动安装Apache服务程序。注意,使用 yum 命令进行安装时,跟在命令后面的Apache 服务的软件包名称为 httpd。
yum install httpd
4)启用 httpd服务(Apache服务程序)并将其加入到开机启动项中去。
systemctl start httpd
systemctl enable httpd
5)测试Apache是否启动成功。打开Firefox浏览,并在地址栏中输入 http://127.0.0.1 查看,如果看到了Apache服务程序的默认页面(如下图),即表示httpd服务启用成功。
二、对 httpd服务进行相关配置
1、httpd服务程序的主要配置文件及其存放位置
2、对httpd服务的主配置文件进行讲解
在 httpd 服务程序的主配置文件中,存在三种类型的信息:注释行信息、全局配置、区域配置。
全局配置参数就是一种全局性的配置参数,可作用于对所有的子站点,既保证了子站点的正常访问,也有效减少了频繁写入重复参数的工作量。区域配置参数则是单独针对于某个独立的子站点进行设置的。
vim /etc/httpd/conf/httpd.conf
该httpd服务的主配置文件中,常用字段及其含义如下图示:
DocumentRoot 参数用于定义网站数据的保存路径,其参数的默认值是把网站数据存放到/var/www/html 目录中;而当前网站普遍的首页面名称是 index.html,因此可以向/var/www/html 目录中写入一个文件,替换掉 httpd 服务程序的默认首页面。
echo "welcome to apache web server." > /var/www/html/index.html
firefox // 打开 Firefox浏览器
3、修改Apache服务程序的DocumentRoot默认根目录
修改完httpd主配置文件后,需手动重启Apache服务程序:
systemctl restart httpd
测试上述DocumentRoot目录是否修改成功。我们向 /home 目录下写入一个 index.html 文件进行测试:
echo "welcome to my apache web app in /home" > /home/index.html
firefox // 打开Firefox浏览器
打开Firefox后,理论上我们应该能看到更新后的index.html页面内容了,但事实上并不是这样的。当我们在Firefox中访问 http://127.0.0.1/index.html时,浏览器显示如下:
为什么会无法连接呢?为什么无法访问Apache更新后的DocumentRoot目录呢?这一切正是 SELinux 在捣鬼,下面我们开始学习SELinux。
三、SELinux安全子系统
1、什么是SELinux?它有什么用?
SELinux(Security-Enhanced Linux)是美国国家安全局在 Linux 开源社区的帮助下开发的一个强制访问控制的安全子系统。RHEL 7 系统使用 SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。
“SELinux 域”和“SELinux 安全上下文”被称为是 Linux 系统中的双保险,系统内的服务程序只能规规矩矩地拿到自己所应该获取的资源,这样即便黑客入侵了系统,也无法利用系统内的服务程序进行越权操作。
2、SELinux服务有哪三种状态模式?
我们强烈推荐SELinux服务处于enforcing模式,这样才能保证生产环境下的Linux更加安全。
1)如何查看SELinux当前所处的状态模式呢?我们可以使用 getenforce 命令获取SELinux的当前状态模式。
获取SELinux当前的状态模式
getenforce
2)如何修改SELinux的状态模式呢?需要注意的是,当我们修改了SELinux的状态模式后,它不会立即生效,需要重启系统后方能生效。
修改SELinux的状态模式
vim /etc/selinux/config
3)如何启用或禁用SELinux?使用 setenforce 命令来启用或禁用SELinux。
setenforce 0 // 禁用SELinux
setenforce 1 // 启用SELinux
4)现在我们已经学会了SELinux的基本使用,我们先禁用掉SELinux,来验证一下上面的Apache的服务自定义了DocumentRoot目录后未生效,是不是因为SELinux导致的?
setenforce 0
systemctl restart httpd
firefox
5)从上面测试可以看出,确实是SELinux限制了Apache自定义的DocumentRoot目录。Apache静态资源的默认目录是/var/www/html,当我们把它修改成/home后,SELinux就开始限制httpd服务了,因为/home目录是用来存放普通用户的家目录数据的,而现在httpd服务要访问/home中的数据,这显然违反了SELinux的监管原则。
6)现在把 SELinux 服务恢复到强制启用安全策略模式,然后分别查看Apache原始网站数据的保存目录与当前网站数据的保存目录,是否拥有不同的 SELinux 安全上下文值?
在文件上设置的 SELinux 安全上下文是由用户段、角色段以及类型段等多个信息项共同组成的。其中,用户段 system_u 代表系统进程的身份,角色段 object_r 代表文件目录的角色,类型段 httpd_sys_content_t 代表网站服务的系统文件。
3、使用semanage命令解决SELinux对httpd服务的限制
针对当前httpd这种被SELinux限制的情况,我们只需要使用 semanage 命令,把当前Apache网站目录/home 的SELinux 安全上下文修改为跟原始网站目录的一样就可以了。
1)semanage命令有什么用?
semanage 命令用于管理 SELinux 的策略。SELinux 服务极大地提升了 Linux 系统的安全性,将用户权限牢牢地锁在笼子里。semanage 命令不仅能够像传统 chcon 命令那样—设置文件、目录的策略,还可以管理网络端口、消息接口(这些新特性将在本章后文中涵盖)。它的常用参数及功能如下:
- -l 参数用于查询;
- -a 参数用于添加;
- -m 参数用于修改;
- -d 参数用于删除。
2)使用semanage命令,向Apache新的资源目录/home中添加一条SELinux安全上下文,进而让/home目录能够被httpd服务程序所访问。
semanage fcontext -a -t httpd_sys_content_t /home
semanage fcontext -a -t httpd_sys_content_t /home/*
restorecon -Rv /home
setenforce 1
firefox
修改完/home的SELinux安全上下文后,还无法立即生效。我们需要手动地使用restorecon命令把设置好的SELinux安全上下文立即生效,-Rv表示递归操作。然而就可以启用SELinux并测试Apache新的资源目录了。
再次查看Apache新目录与旧目录的SELinux安全上下文,如下图示:
总结:原本认为只要把 httpd 服务程序配置妥当就可以大功告成,结果却反复受到了 SELinux 安全上下文的限制。所以,建议大家在配置 httpd 服务程序时,一定要细心、耐心。一旦成功配妥 httpd 服务程序之后,就会发现 SELinux 服务并没有那么难。
四、个人用户主页功能
1、使用httpd的个人用户主页功能
在Linux系统中为每位用户建立一个独立的网站,使用httpd服务程序提供的个人用户主页功能完全可以实现这个需求。该功能可以让系统中所有的用户在自己的家目录中管理个人的网站,而且访问起来也非常容易。
1)第1步:开启httpd的个人用户主页功能。
vim /etc/httpd/conf.d/userdir.conf
- UserDir disabled 参数,表示让httpd开启个人用户主页功能。
- UserDir public_html 参数,表示网站主页数据在用户家目录中的保存目录为 /public_html 目录。
2)第2步:在用户家目录中创建用于保存网站数据的目录/public_html及首页面文件。另外,还需要把家目录的权限修改为 755,保证其他人也有权限读取里面的内容。下面演示为geekxia用户创建个人主页。
su - geekxia
cd ~
mkdir public_html
echo "geekxia home page." > public_html/index.html
chmod -Rf 755 /home/geekxia
systemctl restart httpd
3)第3步:重启httpd服务程序后,在火狐浏览中输入“http://127.0.0.1/~用户名”访问这个用户的个人主页。(不出意外,这样访问会是下面的结果,这一定还是SELinux惹的祸。)
4)使用 getsebool 命令查询并过滤出所有与 HTTP 协议相关的安全策略。其中off 为禁止状态,on 为允许状态。如下图:
5)解决第(4)步中的问题:使用setsebool 命令来修改 SELinux 策略中各条规则,加上 -P 参数让修改后SELinux策略规则立即且永久生效。
setsebool -P httpd_enable_homedirs=on
firefox
修改完httpd_enable_homedirs后,查看geekxia用户的主页,即可成功访问了,如下图:
2、给geekxia的个人主页添加口令验证
个人主页的拥有者如果不希望直接将网页内容显示出来,只想让通过身份验证的用户访问到自己的个人主页,这时就需要给个人主页添加口令验证功能了。
1)第1步:先使用 htpasswd 命令生成密码数据库。-c 参数表示第一次生成;后面再分别添加密码数据库的存放文件,以及口令验证要用到的用户名称(该用户名称不必是系统中已有的本地账户)。
2)第2步:编辑个人用户主页功能的配置文件,如下图这样操作:
vim /etc/httpd/conf.d/userdir.conf
systemctl restart httpd
重启httpd服务,再次在火狐浏览器中查看geekxia用户的个人主页如下图,即可看到此时访问geekxia的个人主页就需要口令验证了。
五、Apache的虚拟主机功能
1、什么是虚拟主机功能?它有什么用?
如果每台运行 Linux 系统的服务器上只能运行一个网站,这显然是一种硬件资源的浪费。在虚拟专用服务器(Virtual Private Server,VPS)与云计算技术诞生以前,IDC 服务供应商为了能够更充分地利用服务器资源,同时也为了降低购买门槛,于是纷纷启用了虚拟主机功能。
利用虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”。但是,该技术无法实现目前云主机技术的硬件资源隔离,让这些虚拟的服务器共同使用物理服务器的硬件资源,供应商只能限制硬盘的使用空间大小。出于各种考虑的因素(主要是价格低廉),目前依然有很多企业或个人站长在使用虚拟主机的形式来部署网站。
Apache 的虚拟主机功能是服务器基于用户请求的不同 IP 地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术。用户请求的资源不同,最终获取到的网页内容也各不相同。
2、基于IP地址的虚拟主机网站
如果一台服务器有多个 IP 地址,而且每个 IP 地址与服务器上部署的每个网站分别对应,这样当用户请求访问不同的 IP 地址时,会访问到不同网站的页面资源。而且,每个网站都有一个独立的 IP 地址,对搜索引擎优化也大有裨益。
1)部署多个Web网站的准备工作
为当前Linux机器配置三个独立的IP地址,配置完成后重启网卡服务,并检查网络的连通性,以确保这个三个IP地址都可以正常地访问。比如,我们使用 nmtui 命令来配置网络参数(网络配置有多种方法可供选择,选择任意一种即可):
[root@localhost sh]# nmtui
手动重启网络,并测试三个IP地址的连接性:
2)在/home目录下创建三个Web数据目录,并分别向其中写入网站的首页文件。
3)配置httpd,添加三个基于IP地址的虚拟主机网站,如下图所示。配置完成后,保存并退出,重启httpd服务。
vim /etc/httpd/conf/httpd.conf
systemctl restart httpd
4)解决SELinux对httpd服务的限制,使用 semanage 命令手动设置三个网站资源的SELinux安全上下文,并使用 restorecon 命令让新设置的SELinux安全上下文立即生效。
semanage fcontext -a -t httpd_sys_content_t /home
semanage fcontext -a -t httpd_sys_content_t /home/web1
semanage fcontext -a -t httpd_sys_content_t /home/web1/*
semanage fcontext -a -t httpd_sys_content_t /home/web2
semanage fcontext -a -t httpd_sys_content_t /home/web2/*
semanage fcontext -a -t httpd_sys_content_t /home/web3
semanage fcontext -a -t httpd_sys_content_t /home/web3/*
restorecon -Rv /home
5)打开火狐浏览器,测试这三个基于IP的虚拟主机网站,如下图:
3、基于域名的虚拟主机网站
当服务器无法为每个网站都分配一个独立 IP 地址的时候,可以尝试让 Apache 自动识别用户请求的域名,从而根据不同的域名请求来传输不同的内容。由于当前还没有介绍如何配置 DNS 解析服务,因此需要手工定义 IP 地址与域名之间的对应关系。/etc/hosts 是 Linux 系统中用于强制把某个主机域名解析到指定 IP 地址的配置文件。简单来说,只要这个文件配置正确,即使网卡参数中没有 DNS 信息也依然能够将域名解析为某个 IP 地址。
1)手工定义 IP 地址与域名之间对应关系的配置文件,保存并退出后会立即生效。并使用 ping 命令测试这些域名,以验证域名是否已经被成功解析为 IP 地址。
vim /etc/hosts
2)在Apache资源目录/home中为三个域名创建相应的网站,并创建相应的首页文件。
3)配置httpd服务,配置完成后重启httpd服务:
vim /etc/httpd/conf/httpd.conf
systemctl restart httpd
4)解决SELinux对httpd服务的限制:为三个网站目录添加SELinux安全上下文,并使用 restorecon 命令让其立即生效。
5)在火狐浏览器中测试三个域名对应的网站,效果图如下:
4、基于端口号的虚拟主机网站
基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。在使用 Apache 配置虚拟网站主机功能时,基于端口号的配置方式是最复杂的。因此我们不仅要考虑 httpd 服务程序的配置因素,还需要考虑到 SELinux 服务对新开设端口的监控。一般来说,使用 80、443、8080 等端口号来提供网站访问服务是比较合理的,如果使用其他端口号则会受到 SELinux 服务的限制。
1)在Apache资源目录下建立两个网站资源,并分别向其中创建首页文件。
2)配置httpd服务:添加端口监听,添加虚拟主机网站参数。配置完成后,重启httpd服务,如下图。
vim /etc/httpd/conf/httpd.conf
systemctl restart httpd
3)解决SELinux安全上下文的限制:为两个资源网站添加SELinux安全上下文。
4)即使已经成功地添加了SELinux安全上下文,重启httpd后仍然会出现报错信息。这是因为 SELinux 服务检测到 6011 和 6012 端口原本不属于 Apache 服务应该需要的资源,但现在却以 httpd 服务程序的名义监听使用了,所以 SELinux 会拒绝使用 Apache服务使用这两个端口。我们可以使用 semanage 命令查询并过滤出所有与 HTTP 协议相关且SELinux 服务允许的端口列表。
可见,SELinux 服务允许的端口中并不包含6011和6012。因此我们需要手动地把这两个端口添加进去。添加成功后重启httpd服务,即可看到这两个端口对应的网站内容了。
systemctl restart httpd
firefox
六、Apache的访问控制
Apache 可以基于主机名、IP 地址、域名和端口号对网站上的资源进行访问控制。它还可以通过 Allow 指令允许某个主机访问服务器上的网站资源,通过 Deny 指令实现禁止访问。在允许或禁止访问网站资源时,还会用到 Order 指令,这个指令用来定义 Allow或 Deny 指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。比如“Order Allow, Deny”表示先将源主机与允许规则进行匹配,若匹配成功则允许访问请求,反之则拒绝访问请求。
1)在Apache资源目录中创建一个网站,如下:
2)为这个网站添加一条访问控制规则:仅允许使用Firefox浏览器来访问这个网站,除此之外的请求都将被拒绝。
systemctl restart httpd
firefox
3)再添加一条访问控制规则:只允许IP地址是 192.168.10.80 的机器访问该网站,httpd服务的配置如下。
systemctl restart httpd
firefox
本章复习题
本章完 2019-01-06