使用 Apache 服务部署静态网站

1.网站服务程序

Web网络服务,通常是指容许用户经过浏览器访问到互联网中各类资源的服务。Apache程序是目前拥有很高市场占有率的Web服务程序之一,其跨平台和安全性普遍被承认且拥有快速、可靠、简单的API扩展。Apache也是RHEL 五、六、7系统中默认的Web服务程序。html

第一步:把光盘设备中的系统镜像挂载到 /media/cdrom 目录。linux

第二步:使用 Vim 编辑器建立 Yum 仓库的配置文件。数据库

第三步:安装 Apache 服务程序。使用yum命令进行安装时,跟在命令后面的Apache服务的软件包名称为httpd。若是直接执行yum install apache命令,则系统会报错。apache

第四步:启动 httpd 服务程序并将其加入到开机启动项中,使其可以跟随系统开机而运行,从而持续为用户提供 Web 服务。浏览器

在浏览器(这里是Firefox)输入 http://127.0.0.1 回车,就能够看到用于提供 Web 服务的 httpd 服务程序的默认页面了。安全

2.配置服务文件参数

httpd 服务程序的主要配置文件及存放位置:服务器

在httpd服务程序的主配置文件中,存在三种类型的信息:注释行信息、全局配置、区域配置。网络

全局配置参数就是一种全局性的配置参数,可做用于对全部的子站点,既保证了子站点的正常访问,也有效减小了频繁写入重复参数的工做量。区域配置参数则是单独针对于每一个独立的子站点进行设置的。在httpd服务程序主配置文件中,最为经常使用的参数以下表:编辑器

DocumentRoot参数用于定义网站数据的保存路径,其参数的默认值是把网站数据存放到/var/www/html目录中;而当前网站广泛的首页面名称是index.html,所以能够向/var/www/html目录中写入一个文件,替换掉httpd服务程序的默认首页面,该操做会当即生效。测试

默认状况下,网站数据是保存在/var/www/html目录中,若是想把保存网站数据的目录修改成/home/wwwroot目录,该怎么操做呢?

第一步:创建网站数据的保存目录,并建立首页文件。

第二步:打开 httpd 的主配置文件,将约第119行用于定义网站数据保存路径的参数DocumentRoot修改成/home/wwwroot,同时还须要将约第124行用于定义目录权限的参数Directory后面的路径也修改成/home/wwwroot。配置文件修改完毕后便可保存并退出。

第三步:重启 httpd 服务验证效果,发现看到了 httpd 服务程序的默认首页面。按理来讲,只有在网站的首页面文件不存在或者用户权限不足时,才显示httpd服务程序的默认首页面。咱们在尝试访问http://127.0.0.1/index.html页面时,居然发现页面中显示“Forbidden,You don't have permission to access /index.html on this server.”。而这一切正是SELinux在捣鬼。

3.SELinux 安全子系统

SELinux(Security-Enhanced Linux)是美国国家安全局在Linux开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。RHEL 7系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。

例如,您在本身的电脑上下载了一个美图软件,当您全神贯注地使用它给照片进行美颜的时候,它却在后台默默监听着浏览器中输入的密码信息,而这显然不该该是它应作的事情。SELinux安全子系统就是为了杜绝此类状况而设计的,它可以从多方面监控违法行为:对服务程序的功能进行限制(SELinux域限制能够确保服务程序作不了出格的事情);对文件资源的访问限制(SELinux安全上下文确保文件资源只能被其所属的服务程序进行访问)。

SELinux服务有三种配置模式:

  • enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
  • permissive:遇到服务越权访问时,只发出警告而不强制拦截。
  • disabled:对于越权的行为不警告也不拦截。

我这里默认就是 enforcing的(可查看该服务的主配置文件 /etc/selinux/config)。

把SELinux当前的运行模式修改成禁用(经过命令 setenforce [0|1],0表明禁用、1表明启用),该修改在重启系统后失效,能够经过 getenforce 命令查看 SELinux服务的运行状态。

而后就能够看到正常的网页内容了。

httpd服务程序的功能是容许用户访问网站内容,所以SELinux确定会默认放行用户对网站的请求操做。可是,咱们将网站数据的默认保存目录修改成了/home/wwwroot,而这就产生问题了。/home目录是用来存放普通用户的家目录数据的,而如今,httpd提供的网站服务却要去获取普通用户家目录中的数据了,这显然违反了SELinux的监管原则。

把SELinux服务恢复到强制启用安全策略模式,而后分别查看原始网站数据的保存目录与当前网站数据的保存目录是否拥有不一样的SELinux安全上下文值:

用户段system_u表明系统进程的身份,角色段object_r表明文件目录的角色,类型段httpd_sys_content_t表明网站服务的系统文件。

针对当前这种状况,咱们只须要使用semanage命令,将当前网站目录/home/wwwroot的SELinux安全上下文修改成跟原始网站目录的同样就能够了。

3.1 semanage 命令

semanage命令用于管理SELinux的策略,格式为“semanage [选项] [文件]”。经常使用参数及做用: -l 查询、-a 添加、-m 修改、-d 删除

向新的网站数据目录中新添加一条SELinux安全上下文,让这个目录以及里面的全部文件可以被httpd服务程序所访问到:

设置后,还需使用 restorecon 命令使设置当即生效,-Rv参数对指定的目录进行递归操做,以及显示SELinux安全上下文的修改过程。最后,再次刷新页面,就能够正常看到网页内容了。

4.我的用户主页功能

httpd服务程序提供的我的用户主页功能可让系统内全部的用户在本身的家目录中管理我的的网站,并且访问起来也很是容易。

第一步:在httpd服务程序中,默认没有开启我的用户主页功能。需编辑配置文件 /etc/httpd/conf.d/userdir.conf,在17行前的UserDir disabled参数前面加上井号(#),表示让httpd服务程序开启我的用户主页功能;同时再把第24行的UserDir public_html参数前面的井号(#)去掉(UserDir参数表示网站数据在用户家目录中的保存目录名称,即public_html目录)。

第二步:在用户家目录中创建用于保存网站数据的目录及首页面文件。还需把家目录的权限修改成 755,保证其余人也有权限读取里面的内容。

第三步:重启 httpd 服务程序,在浏览器的地址栏中输入网址,其格式为“网址/~用户名”,系统显示报错页面,仍是SELinux的问题。

第四步:思考报错缘由。httpd服务程序在提供我的用户主页功能时,该用户的网站数据目录自己就应该是存放到与这位用户对应的家目录中的,因此应该不须要修改家目录的SELinux安全上下文。Linux域确保服务程序不能执行违规的操做,只能本本分分地为用户提供服务。httpd服务中忽然开启的这项我的用户主页功能到底有没有被SELinux域默认容许呢?

使用 getsebool 目录查询并过滤全部与 HTTP 协议相关的安全策略,off 为禁止状态,on为容许。

经过名字大体猜想出相关的策略用途。httpd服务的我的用户主页功能的SELinux域安全策略应该是httpd_enable_homedirs。而后经过setsebool命令来修改SELinux策略中各条规则的布尔值。-P 参数表示使修改当即生效且永久生效。

有时,网站的拥有者并不但愿直接将网页内容显示出来,只想让经过身份验证的用户访客看到里面的内容,这时就能够在网站中添加口令功能了。

第一步:先使用htpasswd命令生成密码数据库。-c参数表示第一次生成;后面再分别添加密码数据库的存放文件,以及验证要用到的用户名称(该用户没必要是系统中已有的本地帐户)。

第二步:编辑我的用户主页功能的配置文件。把从31行开始的内容修改以下。重启httpd服务。

当用户再想访问某个用户的我的网站时,就必需要输入帐户和密码才能正常访问了。

5.虚拟主机功能

若是每台运行Linux系统的服务器上只能运行一个网站,那么人气低、流量小的草根站长就要被迫承担着高昂的服务器租赁费用了,这显然也会形成硬件资源的浪费。Apache的虚拟主机功能是服务器基于用户请求的不一样IP地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术。

5.1 基于 IP 地址

若是一台服务器有多个IP地址,并且每一个IP地址与服务器上部署的每一个网站一一对应,这样当用户请求访问不一样的IP地址时,会访问到不一样网站的页面资源。并且,每一个网站都有一个独立的IP地址,对搜索引擎优化也大有裨益。所以以这种方式提供虚拟网站主机功能最多见。

当前实验经过nmtui命令配置的 IP 以下:

配置完并重启网卡(systemctl restart network)服务后检查网络的连通性:

第一步:分别在/home/wwwroot中建立用于保存不一样网站数据的3个目录,并向其中分别写入网站的首页文件。每一个首页文件中应有明确区分不一样网站内容的信息,方便稍后能更直观地检查效果。

第二步:在httpd服务的配置文件中大约113行处开始,分别追加写入三个基于IP地址的虚拟主机网站参数,重启 httpd 服务。

第三步:此时访问网站,则会看到httpd服务程序的默认首页面。还是 SELinux 的问题。因为当前的/home/wwwroot目录及里面的网站数据目录的SELinux安全上下文与网站服务不吻合,所以httpd服务程序没法获取到这些网站数据目录。须要手动把新的网站数据目录的SELinux安全上下文设置正确,并使用restorecon命令让新设置的SELinux安全上下文当即生效,这样就能够看到网站的访问效果了。

5.2 基于主机域名

当服务器没法为每一个网站都分配一个独立IP地址的时候,能够尝试让Apache自动识别用户请求的域名,从而根据不一样的域名请求来传输不一样的内容。/etc/hosts是Linux系统中用于强制把某个主机域名解析到指定IP地址的配置文件。简单来讲,只要这个文件配置正确,即便网卡参数中没有DNS信息也依然可以将域名解析为某个IP地址。

第一步:手工定义IP地址与域名之间对应关系的配置文件,保存并退出后会当即生效。能够经过分别ping这些域名来验证域名是否已经成功解析为IP地址。

第二步:分别在/home/wwwroot中建立用于保存不一样网站数据的三个目录,并向其中分别写入网站的首页文件。每一个首页文件中应有明确区分不一样网站内容的信息,方便稍后能更直观地检查效果。


第三步:在httpd服务的配置文件中大约113行处开始,分别追加写入三个基于主机名的虚拟主机网站参数。重启httpd服务。

第四步:当前的网站数据目录仍是在/home/wwwroot目录中,所以仍是必需要正确设置网站数据目录文件的SELinux安全上下文,使其与网站服务功能相吻合。而后用restorecon命令让新配置的SELinux安全上下文当即生效。

5.3 基于端口号

基于端口号的虚拟主机功能可让用户经过指定的端口号来访问服务器上的网站资源。在使用Apache配置虚拟网站主机功能时,不只要考虑httpd服务程序的配置因素,还须要考虑到SELinux服务对新开设端口的监控。通常来讲,使用80、44三、8080等端口号来提供网站访问服务是比较合理的,若是使用其余端口号则会受到SELinux服务的限制。

第一步:分别在/home/wwwroot中建立用于保存不一样网站数据的两个目录,并向其中分别写入网站的首页文件。每一个首页文件中应有明确区分不一样网站内容的信息,方便稍后能更直观地检查效果。

第二步:在httpd服务配置文件的第43行和第44行分别添加用于监听6111和6222端口的参数。

第三步:在httpd服务的配置文件中大约113行处开始,分别追加写入两个基于端口号的虚拟主机网站参数。重启 httpd 服务。

第四步:设置网站数据目录文件的SELinux安全上下文。用restorecon命令让新配置的SELinux安全上下文当即生效。

设置完后测试链接,出现报错信息。这是由于SELinux服务检测到6111和6222端口本来不属于Apache服务应该须要的资源,但如今却以httpd服务程序的名义监听使用了,因此SELinux会拒绝使用Apache服务使用这两个端口。使用semanage命令查询并过滤出全部与HTTP协议相关且SELinux服务容许的端口列表:

第五步:手动添加6111和6222端口号到SELinux容许的与http协议相关的端口号中。该操做当即生效且永久有效。

重启httpd服务再次测试,能够看到正确结果。


6.Apache的访问控制

Apache能够基于源主机名、源IP地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。它经过Allow指令容许某个主机访问服务器上的网站资源,经过Deny指令实现禁止访问。在容许或禁止访问网站资源时,还会用到Order指令,这个指令用来定义Allow或Deny指令起做用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。好比“Order Allow, Deny”表示先将源主机与容许规则进行匹配,若匹配成功则容许访问请求,反之则拒绝访问请求。

第一步:先在服务器上的网站数据目录中新建一个子目录,并在这个子目录中建立一个包含Successful单词的首页文件。

第二步:打开httpd服务的配置文件,在第129行后面添加下述规则来限制源主机的访问。这段规则的含义是容许使用Firefox浏览器的主机访问服务器上的首页文件,除此以外的全部请求都将被拒绝。

除了匹配源主机的浏览器特征以外,还能够经过匹配源主机的IP地址进行访问控制。例如,咱们只容许IP地址为192.168.10.20的主机访问网站资源,那么就能够在httpd服务配置文件的第129行后面添加下述规则。这样在重启httpd服务程序后再用本机(即服务器,其IP地址为192.168.10.10)来访问网站的首页面时就会提示访问被拒绝了。