Apache httpd功能篇03—虚拟主机

概述

本章,您将学习到 Apache httpd 中有关虚拟主机的内容。

虚拟主机:也称共享主机,指把一台物理服务器通过管理面板(如 cPanel、Plesk 等面板)在操作系统层面隔离出多个账户,每个账户有独立的文件系统、数据库等,但共享 CPU、内存、带宽等资源。通常而言,虚拟主机都预装了网站运行的必需环境以及数据库,站长直接上传网站的相关内容即可,较适合那些初级用户搭建网站的需求。

VPS(Virtual Private Server,虚拟专有服务器):指把一台物理服务器通过虚拟化技术(如 KVM/OpenVZ 等)在操作系统层面隔离出多个操作系统,每个操作系统独享隔离出的 CPU、内存、带宽等资源。通常而言,VPS 在稳定性上比虚拟主机高,但是其存在不可扩容(部分厂商也支持有限升级的扩容)以及受限于单台物理服务器故障的问题。

云服务器:基于分布式架构的弹性计算服务,支持自动故障迁移、多副本存储与按秒计费,其架构已超越传统 VPS 的单机范式,成为企业级云原生应用的基础设施标准,可用性达 99% 以上。云服务器在不同厂商中所定义的名称不同,如:

  • 阿里云 - ECS(Elastic Compute Service)
  • ‌腾讯云 - ‌CVM(Cloud Virtual Machine)
  • ‌华为云 - ECS(Elastic Cloud Server)
  • 百度智能云 - BCC(Baidu Cloud Compute)
  • 亚马逊 - EC2(Elastic Compute Cloud)
  • ‌Microsoft Azure - Virtual Machine
  • 京东云 - Cloud Virtual Machine

虚拟主机分类

有三大分类:

  • 基于 IP 地址的虚拟主机 - 为 Web 服务器配置多个IP 地址,每个网站绑定一个独立 IP 地址。当用户访问不同 IP 地址时,Web 服务器根据目标 IP 地址将请求分发到对应的网站目录
  • 基于端口的虚拟主机 - Web 服务器使用同一 IP 地址,但通过不同端口号区分网站。例如,80 端口提供给站点 A,90 端口给提供站点 B
  • 基于域名的虚拟主机 - 所有网站共享同一 IP 地址和端口(通常是 80 或 443),Web 服务器通过解析 HTTP 请求头中的 Host 字段(如 Host: www.sitea.com)来识别目标域名,并将请求分发到对应的网站目录

对比如下:

类型 区分方式 IP 地址需求 端口需求 主流程度 典型场景
基于 IP 不同 IP 地址 多个 相同 低(历史遗留) 早期 SSL 站点、特殊兼容需求
基于端口 不同端口号 单个 多个 低(内部使用) 开发测试、内部管理系统
基于域名 HTTP Host请求头 单个 相同 高(95% 以上) 所有常规网站、共享主机

基于域名的虚拟主机演示

需求:使用同一个 Web 服务器,占用的 IP 地址为 192.168.100.20,当客户端访问 "www.sitea.com" 时,网站内容是 "Web A is work!";当客户端访问 "www.testb.com",内容是 "Web B is work!"

由于这里的域名都是假设的,因此还需要自行搭建 DNS 服务器。

角色 操作系统 IP 地址
DNS 服务器 RL 10.2 192.168.100.21/24
Web 服务器 RL 8.10 192.168.100.20/24

配置 DNS 服务器:

Shell > dnf5 -y install bind

# 主配置仅更改这两项
## 主配置文件包含了区域文件 /etc/named.rfc1912.zones
Shell > vim /etc/named.conf
options {
        listen-on port 53 { 192.168.100.21; };
...
        allow-query     { any; };
...
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

# 然后是配置区域文件 /etc/named.rfc1912.zones
## 将默认内容注释掉(利用 vim 的底线命令模式注释掉,如 ":set nu",":17,$ s/^/#/g")
Shell > vim /etc/named.rfc1912.zones
zone "sitea.com" IN {
        type primary;
        file "named.sitea";
        allow-update { none; };
};

zone "testb.com" IN {
        type primary;
        file "named.testb";
        allow-update { none; };
};

# 配置数据解析文件
## bind 提供了一个默认的 /var/named/named.localhost 正向解析文件,可复制并另外重命名该文件进行配置
Shell > cp -p /var/named/named.localhost /var/named/named.sitea
Shell > vim /var/named/named.sitea
$TTL 1D
@       IN SOA  sitea.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      dns.sitea.com.
dns     A       192.168.100.21
www     A       192.168.100.20

Shell > cp -p /var/named/named.localhost /var/named/named.testb
Shell > vim /var/named/named.testb
$TTL 1D
@       IN SOA  testb.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      dns.testb.com.
dns     A       192.168.100.21
www     A       192.168.100.20

# 配置检查
Shell > named-checkconf

Shell > named-checkzone sitea.com /var/named/named.sitea
zone sitea.com/IN: loaded serial 0
OK

Shell > named-checkzone testb.com /var/named/named.testb
zone testb.com/IN: loaded serial 0
OK

# 开启 DNS 服务
Shell > systemctl start named.service

配置 Web 服务器:

Shell > mkdir /usr/local/apache2/htdocs/sitea/ && echo "Web A is work!" > /usr/local/apache2/htdocs/sitea/index.html

Shell > mkdir /usr/local/apache2/htdocs/testb/ && echo "Web B is work!" > /usr/local/apache2/htdocs/testb/index.html

# 编辑主配置 httpd.conf,让其加载虚拟主机扩展配置文件
Shell > vim /usr/local/apache2/conf/httpd.conf
...
Include conf/extra/httpd-vhosts.conf
...

# 虚拟主机扩展配置文件默认会提供一些配置参考,使用 vim 注释掉(":set nu",":23,$ s/^/#/g")
## 该文件的具体配置如下:
Shell > vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
<VirtualHost 192.168.100.20:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "/usr/local/apache2/htdocs/sitea"
    ServerName www.sitea.com
    ErrorLog "logs/sitea-error_log"
    CustomLog "logs/sitea-access_log" common
</VirtualHost>

<VirtualHost 192.168.100.20:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "/usr/local/apache2/htdocs/testb"
    ServerName www.testb.com
    ErrorLog "logs/testb-error_log"
    CustomLog "logs/testb-access_log" common
</VirtualHost>

# 在主配置文件 httpd.conf 中给目录设置权限
Shell > vim /usr/local/apache2/conf/httpd.conf
...
<Directory "/usr/local/apache2/htdocs/sitea">
    Options Indexes FollowSymLinks
    AllowOverride none
    Require all granted
</Directory>

<Directory "/usr/local/apache2/htdocs/testb">
    Options Indexes FollowSymLinks
    AllowOverride none
    Require all granted
</Directory>

# 语法检查
Shell > /usr/local/apache2/bin/apachectl -t
Syntax OK

# 启动 Web 服务器
Shell > /usr/local/apache2/bin/apachectl start

访问

Windows 客户端访问这两个虚拟主机时,需要将主 DNS 配置为 192.168.100.21

虚拟主机

还原

还原 DNS 服务器的配置:

Shell > systemctl stop named.service

# 删除数据解析文件
Shell > rm -rf /var/named/named.sitea /var/named/named.testb

# 还原区域文件
Shell > cat /etc/named.rfc1912.zones
zone "localhost.localdomain" IN {
        type primary;
        file "named.localhost";
        allow-update { none; };
};

zone "localhost" IN {
        type primary;
        file "named.localhost";
        allow-update { none; };
};

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type primary;
        file "named.loopback";
        allow-update { none; };
};

zone "1.0.0.127.in-addr.arpa" IN {
        type primary;
        file "named.loopback";
        allow-update { none; };
};

zone "0.in-addr.arpa" IN {
        type primary;
        file "named.empty";
        allow-update { none; };
};

# 已经修改的主配置文件不需要还原

还原 Web 服务器的配置:

Shell > /usr/local/apache2/bin/apachectl stop

Shell > rm -rf /usr/local/apache2/htdocs/{testb,sitea}

Shell > vim /usr/local/apache2/conf/httpd.conf
...
#Include conf/extra/httpd-vhosts.conf
...
#<Directory "/usr/local/apache2/htdocs/sitea">
#    Options Indexes FollowSymLinks
#    AllowOverride none
#    Require all granted
#</Directory>
#
#<Directory "/usr/local/apache2/htdocs/testb">
#    Options Indexes FollowSymLinks
#    AllowOverride none
#    Require all granted
#</Directory>
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇