Linux学习之十【使用Apache 服务部署静态网站】

本文详细介绍了如何使用Apache服务程序部署静态网站,包括服务程序的安装、配置文件参数设置、SELinux安全子系统管理、个人用户主页功能、虚拟主机功能以及访问控制策略。涵盖了Apache服务的基础配置到高级应用,适合初学者和进阶用户参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整理自刘遄老师的《Linux就该这么学》,网站链接

10、使用Apache 服务部署静态网站

10.1 网站服务程序

Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务。它是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的请求后才会响应,最终用于提供服务程序的Web 服务器会通过HTTP或HTTPS把请求的内容传送给用户。

目前能够提供 Web 网络服务的程序有IIS、Nginx 和Apache 等。

Apache 程序是目前拥有很高市场占有率的Web服务程序之一,它可以运行在Linux 系统、UNIX 系统甚至是Windows 系统中,支持基于IP、域名及端口号的虚拟主机功能,支持多种认证方式,集成有代理服务器模块、安全Socket 层(SSL),能够实时监视服务状态与定制日志消息,并有着各类丰富的模块支持。Apache 程序是在RHEL 5、6、7 系统的默认Web 服务程序。

部署Apache服务程序:

1、把光盘设备中的系统镜像挂载到/media/cdrom 目录。

[root@linuxprobe ~]# mkdir -p /media/cdrom
[root@linuxprobe ~]# mount /dev/cdrom /media/cdrom
mount: /dev/sr0 is write-protected, mounting read-only

2、使用Vim 文本编辑器创建Yum 仓库的配置文件

[root@linuxprobe ~]# vim /etc/yum.repos.d/rhel7.repo
[rhel7]
name=rhel7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0

3、动手安装Apache 服务程序。注意,使用yum 命令进行安装时,跟在命令后面的Apache 服务的软件包名称为httpd。

[root@linuxprobe ~]# yum install httpd
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
Complete!

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

[root@linuxprobe ~]# systemctl start httpd
[root@linuxprobe ~]# systemctl enable httpd
ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.
target.wants/httpd.service'

10.2 配置服务文件参数

httpd 服务程序的主要配置文件及存放位置:
在这里插入图片描述
在 httpd 服务程序的主配置文件中,存在三种类型的信息:注释行信息、全局配置、区域配置。最常用的参数如下:
在这里插入图片描述
DocumentRoot 参数用于定义网站数据的保存路径,其参数的默认值是把网站数据存放到/var/www/html 目录中。当前网站普遍的首页名称是index.html,因此可以向/var/www/html 目录中写入一个文件,替换掉httpd 服务程序的默认首页面。之后再在浏览器中刷新httpd服务程序,就可看到首页内容发生了变化。
但是,当我们想修改网站数据保存的目录时,如在home/wwwroot路径下新建一个index.html,并在httpd服务的主配置文件中将DocumentRoot和Directory都改为home/wwwroot路径时,通过浏览器刷新页面显示的是默认的首页面,而不是我们自己添加的index.html。尝试访问http://127.0.0.1/index.html 页面时,显示“Forbidden,You don’t have permission to access /index.html on this server.”,这是什么原因?都是由下面的SELinux引起的!!

10.3 SELinux安全子系统

SELinux(Security-Enhanced Linux)是美国国家安全局在Linux 开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。RHEL 7 系统使用SELinux 技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源它能够从多方面监控违法行为:对服务程序的功能进行限制(SELinux 域限制可以确保服务程序做不了出格的事情);对文件资源的访问限制(SELinux 安全上下文确保文件资源只能被其所属的服务程序进行访问)。“SELinux 域”和“SELinux 安全上下文”称为是Linux 系统中的双保险。

SELinux 服务有三种配置模式,具体如下:
􀂾 enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
􀂾 permissive:遇到服务越权访问时,只发出警告而不强制拦截。
􀂾 disabled:对于越权的行为不警告也不拦截。
在生产环境下强烈建议配置成 enforcing

[root@linuxprobe ~]# vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

SELinux 服务的主配置文件中,定义的是SELinux 的默认运行状态,可以将其理解为系统重启后的状态,因此它不会在更改后立即生效。可以使用getenforce 命令获得当前SELinux服务的运行模式

[root@linuxprobe ~]# getenforce
Enforcing

此外,还可以使用setenforce [0|1]命令临时修改SELinux 当前的运行模式(0 为禁用,1 为启用),这种修改在系统重启后就会失效。

[root@linuxprobe ~]# setenforce 0
[root@linuxprobe ~]# getenforce
Permissive

再次刷新页面就可以看到正常的网页内容了。
所以之前更换网站数据目录出现问题是因为/home目录是用来存放普通用户的家目录数据的,当httpd网站服务要去获取普通用户家目录中的数据违反了SELinux监管原则。

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

[root@linuxprobe ~]# setenforce 1
[root@linuxprobe ~]# ls -Zd /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
[root@linuxprobe ~]# ls -Zd /home/wwwroot
drwxrwxrwx. root root unconfined_u:object_r:home_root_t:s0 /home/wwwroot

**在文件上设置的SELinux 安全上下文是由用户段、角色段以及类型段等多个信息项共同组成的。**其中,用户段system_u 代表系统进程的身份,角色段object_r 代表文件目录的角色,类型段httpd_sys_content_t 代表网站服务的系统文件。

针对当前这种情况,我们只需要使用semanage 命令,将当前网站目录/home/wwwroot 的SELinux 安全上下文修改为跟原始网站目录的一样就可以了。

1、semanage命令

semanage 命令用于管理SELinux 的策略,格式为“semanage [选项] [文件]”。
SELinux 服务极大地提升了Linux 系统的安全性,将用户权限牢牢地锁在笼子里。semanage 命令不仅能够像传统chcon 命令那样—设置文件、目录的策略,还可以管理网络端口、消息接口。使用semanage 命令时,经常用到的几个参数如下所示:
􀂾 -l 参数用于查询;
􀂾 -a 参数用于添加;
􀂾 -m 参数用于修改;
􀂾 -d 参数用于删除。
例如,可以向新的网站数据目录中新添加一条SELinux 安全上下文,让这个目录以及里
面的所有文件能够被httpd 服务程序所访问到:

[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*

注意,执行上述设置之后,还无法立即访问网站,还需要使用restorecon 命令将设置好的SELinux 安全上下文立即生效。在使用restorecon 命令时,可以加上-Rv 参数对指定的目录进行递归操作,以及显示SELinux 安全上下文的修改过程。最后,再次刷新页面,就可以正常看到网页内容了

[root@linuxprobe ~]# restorecon -Rv /home/wwwroot/
restorecon reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0->
unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /home/wwwroot/index.html context unconfined_u:object_r:home_root_
t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
[root@linuxprobe ~]# firefox

10.4 个人用户主页功能

如果想在系统中为每位用户建立一个独立的网站,通常的方法是基于虚拟网站主机功能来部署多个网站。但这个工作会让管理员苦不堪言(尤其是用户数量很庞大时),而且在用户自行管理网站时,还会碰到各种权限限制,需要为此做很多额外的工作。其实,httpd 服务程序提供的个人用户主页功能完全可以以胜任这个工作。该功能可以让系统内所有的用户在自己的家目录中管理个人的网站,而且访问起来也非常容易。

详见10.4 个人用户主页功能

10.5 虚拟主机功能

利用虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”。但是,该技术无法实现目前云主机技术的硬件资源隔离,让这些虚拟的服务器共同使用物理服务器的硬件资源,供应商只能限制硬盘的使用空间大小。

Apache 的虚拟主机功能是服务器基于用户请求的不同IP 地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术

1、基于IP地址

如果一台服务器有多个IP 地址,而且每个IP 地址与服务器上部署的每个网站一一对应,这样当用户请求访问不同的IP 地址时,会访问到不同网站的页面资源。而且,每个网站都有一个独立的IP 地址,对搜索引擎优化也大有裨益。

详见:基于IP地址配置虚拟主机功能

大体过程
首先为主机配置三个IP地址(第4章与第9章中讲过),在配置完毕并重启网卡服务之后,记得检查网络的连通性,确保三个IP 地址均可正常访问。然后:
1、分别在/home/wwwroot 中创建用于保存不同网站数据的3 个目录,并向其中分别写入网站的首页文件。每个首页文件中应有明确区分不同网站内容的信息,方便我们稍后能更直观地检查效果。
2、在httpd 服务的配置文件中分别追加写入三个基于IP 地址的虚拟主机网站参数,然后保存并退出。记得需要重启httpd 服务,这些配置才生效。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分输出信息………………
113 <VirtualHost 192.168.10.10>
114 DocumentRoot /home/wwwroot/10
115 ServerName www.linuxprobe.com
116 <Directory /home/wwwroot/10 >
117 AllowOverride None
118 Require all granted
119 </Directory>
120 </VirtualHost>
121 <VirtualHost 192.168.10.20>
122 DocumentRoot /home/wwwroot/20
123 ServerName bbs.linuxprobe.com
124 <Directory /home/wwwroot/20 >
125 AllowOverride None
126 Require all granted
127 </Directory>
128 </VirtualHost>
129 <VirtualHost 192.168.10.30>
130 DocumentRoot /home/wwwroot/30
131 ServerName tech.linuxprobe.com
132 <Directory /home/wwwroot/30 >
133 AllowOverride None
134 Require all granted
135 </Directory>
136 </VirtualHost>
………………省略部分输出信息………………
[root@linuxprobe ~]# systemctl restart httpd

3、访问网站,查看是否显示对应配置的首页面。如果没有,是因为当前的/home/wwwroot 目录及里面的网站数据目录的SELinux 安全上下文与网站服务不吻合,因此httpd 服务程序无法获取到这些网站数据目录。我们需要手动把新的网站数据目录的SELinux 安全上下文设置正确(见前文的实验),并使用restorecon 命令让新设置的SELinux 安全上下文立即生效。

2、基于主机域名

当服务器无法为每个网站都分配一个独立IP 地址的时候,可以尝试让Apache 自动识别用户请求的域名,从而根据不同的域名请求来传输不同的内容。由于当前还没有介绍如何配置DNS 解析服务,因此需要手工定义IP 地址与域名之间的对应关系。/etc/hosts 是Linux 系统中用于强制把某个主机域名解析到指定IP 地址的配置文件。简单来说,只要这个文件配置正确,即使网卡参数中没有DNS 信息也依然能够将域名解析为某个IP 地址

详见:基于主机域名配置虚拟主机功能

过程
1、利用Vim编辑/etc/hosts文件,手工定义IP 地址与域名之间对应关系的配置文件,保存并退出后会立即生效。可以通过分别ping 这些域名来验证域名是否已经成功解析为IP 地址。

[root@linuxprobe ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.10 www.linuxprobe.com bbs.linuxprobe.com tech.linuxprobe.com
[root@linuxprobe ~]# ping -c 4 www.linuxprobe.com
PING www.linuxprobe.com (192.168.10.10) 56(84) bytes of data.
64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=2 ttl=64 time=0.077 ms
64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=3 ttl=64 time=0.061 ms
64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=4 ttl=64 time=0.069 ms
--- www.linuxprobe.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.061/0.069/0.077/0.008 ms
[root@linuxprobe ~]#

2、分别在/home/wwwroot 中创建用于保存不同网站数据的三个目录,并向其中分别写入网站的首页文件。每个首页文件中应有明确区分不同网站内容的信息,方便直观地检查效果。
3、在httpd 服务的配置文件中分别追加写入三个基于主机名的虚拟主机网站参数,然后保存并退出。记得需要重启httpd 服务,这些配置才生效。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
………………省略部分输出信息………………
113 <VirtualHost 192.168.10.10>
114 DocumentRoot "/home/wwwroot/www"
115 ServerName "www.linuxprobe.com"
116 <Directory "/home/wwwroot/www">
117 AllowOverride None
118 Require all granted
119 </directory>
120 </VirtualHost>
121 <VirtualHost 192.168.10.10>
122 DocumentRoot "/home/wwwroot/bbs"
123 ServerName "bbs.linuxprobe.com"
124 <Directory "/home/wwwroot/bbs">
125 AllowOverride None
126 Require all granted
127 </Directory>
128 </VirtualHost>
129 <VirtualHost 192.168.10.10>
130 DocumentRoot "/home/wwwroot/tech"
131 ServerName "tech.linuxprobe.com"
132 <Directory "/home/wwwroot/tech">
133 AllowOverride None
134 Require all granted
135 </directory>
136 </VirtualHost>
………………省略部分输出信息………………

4、因为当前的网站数据目录还是在/home/wwwroot 目录中,因此还是必须要正确设置网站数据目录文件的SELinux 安全上下文,使其与网站服务功能相吻合。最后记得用restorecon 命令让新配置的SELinux 安全上下文立即生效。

3、基于端口号

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

详见:基于端口号配置虚拟主机功能

1、分别在/home/wwwroot 中创建用于保存不同网站数据的两个目录,并向其中分别写入网站的首页文件。
2、在httpd 服务配置文件的第43 行和第44 行分别添加用于监听6111 和6222端口的参数。
3、在httpd 服务的配置文件中大约113 行处开始,分别追加写入两个基于端口号的虚拟主机网站参数,然后保存并退出。记得需要重启httpd 服务,这些配置才生效。
4、设置网站数据目录文件的SELinux 安全上下文,使其与网站服务功能相吻合。最后记得用restorecon 命令让新配置的SELinux 安全上下文立即生效。
在进行上述配置并重启httpd服务后,出现报错信息。这是因为SELinux 服务检测到6111 和6222 端口原本不属于Apache 服务应该需要的资源,但现在却以httpd 服务程序的名义监听使用了,所以SELinux 会拒绝使用Apache服务使用这两个端口。使用semanage 命令查询并过滤出所有与HTTP 协议相关且SELinux 服务允许的端口列表。

[root@linuxprobe ~]# 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

接着:
5、将6111和6222两个端口号手动添加进去。该操作会立即生效,而且在系统重启过后依然有效。设置好后再重启httpd 服务程序,然后就可以看到网页内容了。

[root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6111
[root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6222
[root@linuxprobe ~]# 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 6222, 6111, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
[root@linuxprobe ~]# systemctl restart httpd
[root@linuxprobe ~]# firefox

10.6 Apache的访问控制

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值