RH358配置Web服务器–使用 Apache HTTPD 对虚拟主机进行配置和故障排除
介绍虚拟主机的配置和常见排错。
RH358专栏地址:https://blog.csdn.net/qq_41765918/category_11532281.html
1. 通过 VIrtual Hosts(虚拟主机)提供多个网站
虚拟主机允许一个web服务器为多个网站提供内容。web服务器可以根据客户端连接到的服务器的特定IP地址或客户端HTTP请求中的站点名称,使用不同的配置设置提供不同的内容。
当启动多个服务器来服务许多低流量站点的成本效益不高时,通常使用虚拟主机。例如,这在共享托管环境中很常见。
2. 配置Apache HTTPD虚拟主机
使用块指令覆盖虚拟主机主配置文件中的设置。每个虚拟主机都有自己的块。
在/etc/httpd/ conf.d/中单独的以.conf结尾的配置文件中配置虚拟主机是一种很好的做法。这使得部署和更新主机变得更容易,而不会影响web服务器配置的其他部分。
下面的示例是/etc/httpd/conf.d/site1.conf,它为site1设置了一个虚拟主机。它侦听服务器的192.168.0.1 IP地址。
<Directory /srv/site1/www>
Require all granted
AllowOverride None
</Directory>
<VirtualHost 192.168.0.1:80>
DocumentRoot /srv/site1/www
ServerName site1.example.com
ServerAdmin webmaster@site1.example.com
ErrorLog "logs/site1_error_log"
CustomLog "logs/site1_access_log" combined
</VirtualHost>
将所有主服务器指令放在任何虚拟主机设置之前是一个很好的做法。这使得配置更容易理解。如果没有为虚拟主机显式设置,将使用主配置中的相同设置。
控制虚拟主机的选择
如果每个虚拟主机都配置了自己的私有IP地址,那么它就被称为基于IP的虚拟主机(首先匹配)。
如果多个虚拟主机共享相同的IP地址,确定将流量发送到哪个虚拟主机的唯一方法是检查客户端的HTTP请求和虚拟主机的serverName和ServerAlias指令。这种配置中的虚拟主机有时称为基于名称的虚拟主机。在过去,基于名称的虚拟主机不能提供安全服务,但现在已经不是这样了。
指令的IP地址部分可以用星号(*)通配符替换,以匹配web服务器上的所有地址。
选择用于处理客户端请求的虚拟主机块,如下所示:
-
当请求到达时,httpd首先尝试将传入连接的地址和端口与具有显式IP地址和端口集的虚拟主机匹配。如果匹配失败,则检查带有通配符IP地址的虚拟主机。如果恰好有一个匹配的虚拟主机定义,则使用基于ip的虚拟主机。 -
如果有多个虚拟主机定义匹配,这就是基于名称的虚拟主机。如果客户端的HTTP请求包含一个Host: header, 识别服务器,客户端试图达到,寻找第一个虚拟主机列表加载的实现方式在头文件的名称作为其ServerName或ServerAlias,使用的是虚拟主机。当/etc/httpd/conf中包含有多个虚拟主机*.conf文件时,它们按系统的排序顺序加载(通常按文件名的字母顺序)。 -
如果有一个虚拟主机定义,包含指令的IP地址部分。替换为_default_,它有一个匹配的端口,没有其他虚拟主机匹配,该虚拟主机将被使用。(匹配通配符IP地址的虚拟主机使用该定义,而不是同样匹配default_的虚拟主机) -
如果没有匹配的虚拟主机定义,“主”服务器配置将为请求服务。
3. 虚拟主机故障排除
在对虚拟主机进行故障排除时,有许多方法可以提供帮助。
-
为每个虚拟主机配置一个单独的DocumentRoot,带有标识内容。 -
为每个虚拟主机配置单独的日志文件,包括错误日志和访问日志。 -
计算httpd解析虚拟主机定义的顺序。包含的文件将根据文件名以字母数字排序的顺序读取。 -
逐个禁用虚拟主机,隔离问题。虚拟主机定义可以注释出配置文件,所包含的配置文件可以临时改名为不以.conf结尾的内容。 -
journalctl -u httpd.service 可显示仅限于与 httpd 服务相关的日志
4. 课本练习
[student@workstation ~]$ lab web-virtual start
1. 安装软件
[root@servera ~]
2. 创建内容目录
[root@servera ~]
[root@servera ~]
[root@servera ~]
[root@servera ~]
Relabeled /srv/default/www from unconfined_u:object_r:var_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /srv/default/www/index.html from unconfined_u:object_r:var_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /srv/www-x.lab.example.com/www from unconfined_u:object_r:var_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /srv/www-x.lab.example.com/www/index.html from unconfined_u:object_r:var_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
3. 按要求创建虚拟主机
[root@servera ~]
<VirtualHost _default_:80>
DocumentRoot /srv/default/www
CustomLog "logs/default-vhost.log" combined
<Directory /srv/default/www>
Require all granted
</Directory>
</VirtualHost>
[root@servera ~]
<VirtualHost *:80>
ServerName www-x.lab.example.com
ServerAlias www-x
DocumentRoot /srv/www-x.lab.example.com/www
CustomLog "logs/www-x.lab.example.com.log" combined
<Directory /srv/www-x.lab.example.com/www>
Require all granted
</Directory>
</VirtualHost>
**注意:**因为Directory指令嵌套在virtualHost指令中,所以它只应用于这个虚拟主机。其他虚拟主机使用这个目录的设置继承自主配置。这有助于确保对虚拟主机文档根的访问只授予拥有它的虚拟主机。
4. 启动并设置好防火墙
[root@servera ~]
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@servera ~]
[root@servera ~]
5. 测试访问
[student@workstation ~]$ curl http://www-x.lab.example.com
www-x
[student@workstation ~]$ curl http://www-x
www-x
[student@workstation ~]$ curl http://servera.lab.example.com
Coming Soon!
[student@workstation ~]$ curl http://172.25.250.10
Coming Soon!
完成实验
[student@workstation ~]$ lab web-virtual finish
总结
- 配置虚拟主机提供Web服务。
- 虚拟主机故障排错。
- 若喜欢金鱼哥的文章,顺手点个赞。也可点个关注,因为后续会不断上干货。
|