使用 Apache 服务部署静态网站

Posted 脱下长日的假面

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Apache 服务部署静态网站相关的知识,希望对你有一定的参考价值。

1.网站服务程序

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

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

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

第三步:安装 Apache 服务程序。使用yum命令进行安装时,跟在命令后面的Apache服务的软件包名称为httpd。如果直接执行yum install 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、443、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)来访问网站的首页面时就会提示访问被拒绝了。

以上是关于使用 Apache 服务部署静态网站的主要内容,如果未能解决你的问题,请参考以下文章

使用Apache服务部署静态网站

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

使用Apache服务部署静态网站

使用 Apache 服务部署静态网站

使用Apache服务部署静态网站

Apache服务部署静态网站