Linux——使用 Apache 服务部署静态网站

安装 Apache 服务程序

① 安装 Apache 服务程序
需要注意 Apache 服务程序的软件包名叫做 httpd,而不是 apache。
输入命令:yum install httpd 进行安装:

② 运行 Apache 服务程序并设置为开机启动
启动 Apache 服务程序:systemctl start httpd
设置为开机自启动:systemctl enable httpd

③ 打开浏览器后,输入 127.0.0.1 就可以看到 Apache 的默认页面
在这里插入图片描述


配置服务文件参数

先了解一下 httpd 服务目录都是干什么用的:

目录 路径
服务目录 /etc/httpd
配置文件 /etc/httpd/conf/httpd.conf
网站数据目录 /var/www/html
访问日志 /var/log/httpd/access_log
错误日志 /var/log/httpd/error_log

打开 Apache 服务程序的配置文件:vim /etc/httpd/conf/httpd.conf
发现配置文件共有 353 行,其实所有以 “#” 号开始的都是逐世行,真正的参数只有:

参数 意义
ServerRoot 服务目录
ServerAdmin 管理员邮箱
User 运行服务的用户
Group 运行服务的用户组
ServerName 网站服务器的域名
DocumentRoot 网站数据目录
Listen 监听的 IP 地址与端口号
DirectoryIndex 默认的索引页页面
ErrorLog 错误日志文件
CustomLog 访问日志文件
Timeout 网页超时时间,默认为 300 秒
Include 需要加载的其他文件

Apache 服务程序的配置文件内容分为三种类型:注释行信息、全局配置、区域配置
在这里插入图片描述

默认的网站数据是存放在 /var/www/html 目录中的,首页名称是 index.html。
使用 echo 命令将指定的字符写入到网站数据目录中的 index.html 文件中。
echo "Hello World~~~~ By yt" > /var/www/html/index.html

再次打开浏览器,输入 127.0.0.1:
在这里插入图片描述

更改网站数据目录

若想将网站数据放在 /home/wwwroot 目录下,则需要对 Apache 服务程序的配置文件进行编辑。

① 使用 vim 文本编辑器进行编辑,将在 119 行的 DocumentRoot 参数修改为 “/home/wwwroot”,再把 123 行的 “/var/www” 修改为 “/home/wwwroot
在这里插入图片描述

② 建立网站数据目录
mkdir /home/wwwroot

③ 创建首页文件
echo "The New Web Directory——By yt > /home/wwwroot/index.html"

④ 重新启动 Apache 服务,打开浏览器输入 127.0.0.1:
在这里插入图片描述
发现出现的是默认页面,进一步来访问 127.0.0.1/index.html ,会提示:访问页面的行为是被禁止的。
在这里插入图片描述
这是因为 SElinux的作用,这里输入命令:setenforce 0 来停止 SELinux 服务再试试。
在这里插入图片描述
成功出现了输入的字符。


SELinux

SELinux 全程为 Security-Enhanced Linux,是一个强制访问控制的安全子系统。SELinux 属于 MAC 强制访问控制 (Mandatory Access Control),即让系统中的各个服务进程都受到约束,仅能访问到被允许访问的文件。

SELinux 有三种模式

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

可以使用 vim 编辑 SELinux 的配置文件将服务设为默认启用,把 SELINUX 设为 enforcing:
vim /etc/selinux/config 进入配置文件
在这里插入图片描述

使用命令 getenforce 命令查看当前的 SELinux 服务状态(由于刚刚关闭了 SELinux,所以此时的状态应该为 Permissive):
在这里插入图片描述

输入命令 setenforce 1 将SELinux 服务开启:
在这里插入图片描述

开启 SELinux 的允许策略

刚刚 SELinux 服务开启时,浏览器提示没有访问权限,故我们可以来开启 SELinux 的允许策略。

SELinux 安全策略包括 域 和 安全上下文:

  • SELinux 域:对进程资源进行限制 (查看方式:ps -Z)
  • SELinux 安全上下文:对系统资源进行限制 (查看方式:ls -Z)

使用 ls -Z 命令来查看新旧网站数据目录的 SELinux 安全上下文有何不同:
在这里插入图片描述
通过对比可以得出解决方法,将当前网站目录 “/home/wwwroot” 的安全上下文修改为 unconfined_u:object_r:httpd_sys_content_t:s0 即可。

semanage 命令可用于查询与修改 SELinux 的安全上下文,格式为:semanage [选项] [文件]
semanage 的部分选项如下:

选项 作用
-l 查询
-a 增加
-m 修改
-d 删除

restorecon 命令用于恢复 SELinux 的安全上下文,格式为:restorecon [选项] [文件]
restorecon 的部分选项如下:

选项 作用
-i 忽略不存在的文件
-e 排除目录
-R 递归处理,针对目录使用
-v 显示详细过程
-F 强制恢复

① 修改当前网站数据目录的安全上下文:semanage fcontext -a -t httpd_sys_content_t /home/wwwroot

② 修改网站数据的安全上下文 (* 代表所有文件或目录):
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*

③ 刷新恢复安全上下文:
restorecon -Rv /home/wwwroot

④刷新浏览器后看到正常页面

在这里插入图片描述
在这里插入图片描述


个人用户主页功能

Apache 服务程序中有个默认未开启的个人用户主页功能,能够为所有系统内的用户生成个人网站。

1. 开启个人用户主页功能
使用 vim 编辑器进行编辑:
vim /etc/httpd/conf.d/userdir.conf

将第 17 行的 “UserDir disabled” 前加一个 # ,代表该行被注释掉,不再起作用。
将第 23 行的 “UserDir public_html” 前的 # 去掉,表示该行被启用。

注:UserDir 参数表示的是需要在用户家目录中创建的网站数据目录的名称
在这里插入图片描述

2. 重启 Apache 服务程序
systemctl restart httpd

3. 创建个人用户网站数据
① 切换至普通用户 yt 的家目录:
su - yt

② 在家目录下创建网站数据目录public_html:
mkdir public_html

③写入首页内容:
echo "This is yt's website" > public_html/index.html

④ 给予网站目录 755 的访问权限:
chmod -Rf 755 ./

⑤ 打开浏览器,访问地址为 “127.0.0.1/~用户名”, 此即为:127.0.0.1/~yt,发现出错。
在这里插入图片描述

这次报错不是因为用户家的网站数据目录 SELinux 安全上下文没有设置,而是因为 SELinux 默认就不允许 Apache 服务个人用户主页这项功能

4. 设置 SELinux 允许策略
getsebool 命令用于查询所有 SELinux 规则的布尔值 (0 或 off为禁止,1 或 on 为允许),格式为:getsebool -a

setsebool 命令用于修改 SELinux 策略内各项规则的布尔值,格式为:setsebool [选项] 布尔值=[0 | 1]

先搜索并查看所有与家目录有关的 SELinux 策略:
在这里插入图片描述

将个人用户网站功能策略 (httpd_enable_homedirs) 设置为允许 (注:要在 root 用户下才能设置):
setsebool -P httpd_enable_homedirs=on

5. 再次刷新浏览器访问 127.0.0.1/~yt
在这里插入图片描述

6. 增加密码安全验证
① 使用 htpasswd 命令生成密码数据库 (-c 参数用于第一次生成):
htpasswd -c /etc/httpd/passwd yt
在这里插入图片描述

② 编辑配置文件开启密码验证:
具体参数如下:
在这里插入图片描述

③ 重启 Apache 服务程序
systemctl restart httpd

④ 重新访问 127.0.0.1/~yt
在这里插入图片描述
若口令输入错误则会直接被禁止访问。

注:这里 User Name 是 yt,密码并非该用户的系统密码,而是 htpasswd 命令创建的网站密码


虚拟网站主机功能

Apache 的虚拟主机功能 (Virtual Host) 可以让一台服务器基于 IP、主机名 或 端口号 实现多个网站服务的技术。

基于 IP 地址

一台服务器拥有多个 IP 地址,当用户访问不同 IP 地址时显示不同的网站页面。

1. 使用 nmtui 命令为网卡添加多个 IP 地址
在这里插入图片描述

然后激活网卡:
在这里插入图片描述

还要 ping 一下测试是否连通。

2. 分别创建网站数据目录
① 在home/wwwroot/ 目录下分别创建三个网站数据目录:
在这里插入图片描述

分别在三个网站数据目录中写入主页文件,内容为该网站的 IP 地址:
在这里插入图片描述

3. 在配置文件中描述基于 IP 地址的虚拟主机
vim /etc/httpd/conf/httpd.conf
在配置文件后加入如下描述:

<VirtualHost 10.10.10.140>
DocumentRoot "/home/wwwroot/140"
ServerName aaa.yt.com
<Directory "/home/wwwroot/140">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

<VirtualHost 10.10.10.150>
DocumentRoot "/home/wwwroot/150"
ServerName bbb.yt.com
<Directory "/home/wwwroot/150">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

<VirtualHost 10.10.10.160>
DocumentRoot "/home/wwwroot/160"
ServerName ccc.yt.com
<Directory "/home/wwwroot/160">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

在这里插入图片描述

4. 修改网站数据目录的 SELinux 安全上下文
需要分别修改网站数据目录以及网页文件的 SELinux 安全上下文,并恢复:
在这里插入图片描述

5. 分别访问 10.10.10.140、10.10.10.150、10.10.10.160 来验证
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


基于主机名

当服务器无法为每个网站都分配到独立 IP 地址时,可以让 Apache 服务程序自动识别来源主机名或域名然后跳转到指定的网站。

1. 配置网卡 IP
在这里插入图片描述

2. 配置 hosts 文件
hosts 文件作用是定义 IP 地址与主机名的映射关系,即强制将某个主机名地址解析到指定的 IP 地址
输入命令:vim /etc/hosts 进行配置。
在这里插入图片描述

3. 分别创建网站数据目录和首页文件
① 创建网站数据目录
在这里插入图片描述

②分别在网站目录中写入不同的首页文件
在这里插入图片描述

4 在配置文件中描述基于主机名称的虚拟主机
输入命令:vim /etc/httpd/conf/httpd.conf 进行配置。

在配置文件的末尾按照如下格式定义虚拟主机信息:

<VirtualHost 10.10.10.136>
DocumentRoot "/home/wwwroot/aaa"
ServerName "aaa.yt.com"
<Directory "/home/wwwroot/aaa">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

<VirtualHost 10.10.10.136>
DocumentRoot "/home/wwwroot/bbb"
ServerName "bbb.yt.com"
<Directory "/home/wwwroot/bbb">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

<VirtualHost 10.10.10.136>
DocumentRoot "/home/wwwroot/ccc"
ServerName "ccc.yt.com"
<Directory "/home/wwwroot/ccc">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

在这里插入图片描述

5. 重启 Apache 网站服务程序
systemctl restart httpd

6. 修改网站数据目录的 SELinux 安全上下文
在这里插入图片描述

7. 分别访问网站验证结果
分别输入 主机名
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


基于端口号

可以让服务器开启多个服务端口后,然后让用户能够通过服务器的指定端口来找到想要的网站。

1. 配置服务器的 IP 地址
在这里插入图片描述

2. 分别创建网站数据目录
① 分别创建端口为 6666,7777 的网站数据目录
在这里插入图片描述

②分别在网站数据目录中写入不同内容的主页文件
在这里插入图片描述

3. 在配置文件中描述基于端口号的虚拟主机
输入命令:vim /etc/httpd/conf/httpd.conf

① 找到在 42 行的 Listen 80,并在下面追加:
在这里插入图片描述

② 接着在该配置文件中描述基于端口号的虚拟主机:

<VirtualHost 10.10.10.137:6666>
DocumentRoot "/home/wwwroot/6666"
ServerName aaa.yt.com
<Directory "/home/wwwroot/6666">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

<VirtualHost 10.10.10.137:7777>
DocumentRoot "/home/wwwroot/7777"
ServerName bbb.yt.com
<Directory "/home/wwwroot/7777">
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

在这里插入图片描述
4. 重启 Apache 网站服务程序
systemctl restart httpd

发现报错了
在这里插入图片描述
这是因为 SELinux 服务检测到 6666 和 7777 端口原本并不属于 Apache 服务端口,但是现在却被以 Apache 的名义监听了。

5. 修改网站数据目录的 SELinux 安全上下文并允许端口监听
① 修改网站数据目录的安全上下文
在这里插入图片描述

② 使用 semanage 命令搜索在 SELinux 系统中有关 http 服务的端口号:
输入命令:semanage port -l | grep http
在这里插入图片描述

③ 将 6666 和 7777 端口添加进去
输入命令:
semanage port -a -t http_port_t -p tcp 6666
semanage port -a -t http_port_t -p tcp 7777

然后再查看 SELinux 的端口规则:
在这里插入图片描述

④ 再次尝试重启 Apache 网站服务程序
systemctl restart httpd

6. 分别访问网站验证结果
在这里插入图片描述
在这里插入图片描述


Apache 的访问控制

还可以基于 主机名、IP 地址 以及客户端特征做 Apache 网页资源的访问控制。

常用的指令有:Order (排序)、Allow (允许)、Deny (拒绝)、Satisfy (满足)。其中 Order 指令用于定义 Allow 或 Deny 起作用的顺序,分别实现了允许或拒绝某个主机访问服务器网页资源。

匹配原则为:按照顺序匹配规则并执行,若未匹配成功则执行后面的执行。
如:Order Allow,Deny,代表:先将客户端与允许规则进行对比,若匹配成功则允许访问,反之则直接拒绝

例子:
① 只允许 IE 浏览器访问本网站数据

先创建网站数据目录和首页文件:
mkdir /var/www/html/server
echo "IE Successful" > /car/www/html/server/index.html

进入配置文件进行修改:
vim /etc/httpd/conf/httpd.conf

在大约 129 行处添加参数:

<Directory "/var/www/html/server">
SetEnvlf User-Agent "Internet Explorer" ie=1
Order alllow,deny
Allow from env=ie

然后重启 Apache 服务
systemctl restart httpd

② 根据来访源地址,仅限 192.168.10.10 的主机访问本网站

进入配置文件进行相关配置:
vim /etc/httpd/conf/httpd.conf

大约在 129 行的地方添加参数:

Order allow,deny
Allow from 192.168.10.20

保存配置文件后重启服务即可。