Apache服务:使用 Apache 服务部署静态网站

1.安装Apache服务

  第一步:安装Apache服务程序   yum install httpd

      具体流程参考https://www.cnblogs.com/python-wen/p/10168452.html

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

      systemctl  restart  httpd

      systemctl  enable  httpd

  第三步:测试Apache服务安装是否成功

      在浏览器中输入本机的IP地址,测试Apache服务是否安装成功,看到此页面说明Apache服务已经成功安装。

2.配置服务文件参数

  httpd 服务程序的主要配置文 件及存放位置如表 10-1所示:

在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服务的运行状态。

再次刷新网页,就会看到正常的网页内容了,如图所示。可见,问题确实是出在了 SELinux 服务上面。

【反思:前面的操作中到底是哪里出问题了呢? 】httpd 服务程序的功能是允许用户访问网站内容,因此 SELinux 肯定会默认放行用户对网站的请求操作。但是,我们将网站数据的默认保存目录修改为了/home/wwwroot,而这就产生 问题了。之前讲到,/home 目录是用来存放普通用户的家目录数据的,而现在,httpd 提供的网站服务却要去获取普通用户家目录中的数据了,这显然违反了 SELinux 的监管原则。

现在,我们把 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 命令将设置好的 SELinux 安全上下文立即生效。在使用 restorecon 命令时,可以加上-Rv 参数对指定的目录进 行递归操作,以及显示 SELinux 安全上下文的修改过程。

最后,再次刷新页面,就可以正常 看到网页内容了,结果如图所示:

4.个人用户主页功能

  如果想在系统中为每位用户建立一个独立的网站,httpd 服务程序提供的个人用户主页功能完全可以以胜任这个工作。该功能可以让系统内所有的用户在自己的家目录中管理个人的网站,而且访问起来也非常容易。

  第一步:在 httpd 服务程序中,默认没有开启个人用户主页功能。为此,我们需要编辑下面的配置文件,然后在第 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~35 行的参数信息修改成下列内容,其中井号(#)开头的内容为刘遄老师添加的注释信息,可将其忽略。随后保存并退出配 置文件,重启 httpd 服务程序即可生效。注意重启时先将SELinux关闭,再重启httpd,然后再打开SELinux:(setenforce 0 #  systemctl restart httpd  #  setenforce 1)如果不这样做,系统会报错如下:

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

此后,当用户再想访问某个用户的个人网站时,就必须要输入账户和密码才能正常访问 了。另外,验证时使用的账户和密码是用 htpasswd 命令生成的专门用于网站登录的口令密码, 而不是系统中的用户密码,请不要搞错了。如图所示:

5.虚拟主机功能

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

5.1 基于IP地址

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

 当前实验通过nmtui命令配置的 IP 如下:

  第一步:分别在/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 安全上下文。

5.3 基于端口号

  基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。在使用Apache配置虚拟网站主机功能时,不仅要考虑httpd服务程序的配置因素,还需要考虑到SELinux服务对新开设端口的监控。一般来说,使用80、443、8080等端口号来提供网站访问服务是比较合理的,如果使用其他端口号则会受到SELinux服务的限制。

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

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

  第三步:在 httpd 服务的配置文件中大约 113 行处开始,分别追加写入两个基于端口号的虚拟主机网站参数,然后保存并退出。记得需要重启 httpd 服务,这些配置才生效。

  第四步:因为我们把网站数据目录存放在/home/wwwroot 目录中,因此还是必须要正确设置网站数据目录文件的 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)来访问网站的首页面时就会提示访问被拒绝了。

结果:只有IP地址为192.168.232.152的主机可以成功访问服务器,其它都被禁止。

猜你喜欢

转载自www.cnblogs.com/python-wen/p/10184519.html