菜鸟科技网

Apache如何搭建多个虚拟网站?

基于名称的虚拟主机基于IP的虚拟主机基于名称的虚拟主机 是最常用、最推荐的方法。

Apache如何搭建多个虚拟网站?-图1
(图片来源网络,侵删)

核心概念:什么是虚拟主机?

虚拟主机允许 Apache 在同一台服务器上根据不同的域名或 IP 地址,将访问请求指向不同的网站根目录,这样,当用户访问 www.siteA.com 时,Apache 就会提供 siteA.com 的内容;当用户访问 www.siteB.com 时,则提供 siteB.com 的内容。


基于名称的虚拟主机(最常用)

这是最流行的方法,它通过客户端请求中包含的 Host 头信息来判断应该访问哪个网站,你只需要一个 IP 地址就可以托管无数个网站。

步骤 1:确保 Apache 已安装并启用 mod_vhost_alias 模块

这个模块是 Apache 虚拟主机的核心,在安装 Apache 时它会被默认安装并启用。

  • 检查模块是否启用:

    Apache如何搭建多个虚拟网站?-图2
    (图片来源网络,侵删)
    # 对于使用 systemd 的系统 (如 Ubuntu 16+, CentOS 7+)
    sudo apache2ctl -M | grep vhost_alias
    # 或者
    httpd -M | grep vhost_alias
    # 如果看到 `vhost_alias_module (shared)`,说明已启用。
  • 启用模块(如果未启用):

    • Debian/Ubuntu 上:
      sudo a2enmod vhost_alias
    • CentOS/RHEL 上:
      sudo yum install mod_ssl # 通常包含该模块
      # 确保 httpd.conf 中有 LoadModule vhost_alias_module ...

步骤 2:为每个网站创建目录结构

我们需要为每个网站创建一个独立的存放网页文件的目录。

# 创建网站根目录
sudo mkdir -p /var/www/siteA.com/html
sudo mkdir -p /var/www/siteB.org/html
# 设置目录所有者
# www-data 是 Debian/Ubuntu 的默认 Apache 用户
# apache 是 CentOS/RHEL 的默认 Apache 用户
sudo chown -R www-data:www-data /var/www/siteA.com/html
sudo chown -R www-data:www-data /var/www/siteB.org/html
# 设置目录权限
sudo chmod -R 755 /var/www

步骤 3:为每个网站创建首页文件

为了测试,我们在每个网站目录下创建一个简单的 index.html 文件。

# 为 siteA.com 创建首页
sudo nano /var/www/siteA.com/html/index.html

在文件中输入:

Apache如何搭建多个虚拟网站?-图3
(图片来源网络,侵删)
<!DOCTYPE html>
<html>
<head>Welcome to Site A!</title>
</head>
<body>
    <h1>This is Site A</h1>
    <p>If you see this, it means your virtual host for siteA.com is working!</p>
</body>
</html>
# 为 siteB.org 创建首页
sudo nano /var/www/siteB.org/html/index.html

在文件中输入:

<!DOCTYPE html>
<html>
<head>Welcome to Site B!</title>
</head>
<body>
    <h1>This is Site B</h1>
    <p>If you see this, it means your virtual host for siteB.org is working!</p>
</body>
</html>

步骤 4:创建虚拟主机配置文件

这是最关键的一步,我们将为每个网站创建一个独立的配置文件,并将它们放在 sites-available 目录下。

  • 在 Debian/Ubuntu 上: Apache 的配置文件通常存放在 /etc/apache2/sites-available/ 目录,我们可以创建一个模板文件,然后复制并修改。

    # 创建一个默认配置文件作为模板
    sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/siteA.com.conf
  • 在 CentOS/RHEL 上: 配置文件通常在 /etc/httpd/conf.d/ 目录,这个目录下的任何 .conf 文件都会被 Apache 自动加载。

    # 直接创建配置文件
    sudo nano /etc/httpd/conf.d/siteA.com.conf

我们来编辑 siteA.com.conf 文件:

# 虚拟主机配置开始
<VirtualHost *:80>
    # ServerName 是你网站的主域名
    ServerName siteA.com
    # ServerAlias 是你网站的其他域名(可选)
    ServerAlias www.siteA.com
    # DocumentRoot 是你网站文件的根目录
    DocumentRoot /var/www/siteA.com/html
    # 错误日志文件
    ErrorLog ${APACHE_LOG_DIR}/siteA.com_error.log
    # 访问日志文件
    CustomLog ${APACHE_LOG_DIR}/siteA.com_access.log combined
</VirtualHost>
# 虚拟主机配置结束

同样,为 siteB.org 创建配置文件 siteB.org.conf

<VirtualHost *:80>
    ServerName siteB.org
    ServerAlias www.siteB.org
    DocumentRoot /var/www/siteB.org/html
    ErrorLog ${APACHE_LOG_DIR}/siteB.org_error.log
    CustomLog ${APACHE_LOG_DIR}/siteB.org_access.log combined
</VirtualHost>

步骤 5:启用新的虚拟主机配置

  • 在 Debian/Ubuntu 上: 我们使用 a2ensite 命令来创建一个指向配置文件的软链接到 sites-enabled 目录。

    sudo a2ensite siteA.com.conf
    sudo a2ensite siteB.org.conf
  • 在 CentOS/RHEL 上: 因为配置文件在 conf.d 目录下,所以只要文件存在,Apache 就会自动加载,无需额外操作。

步骤 6:测试并重启 Apache

在重启服务之前,务必先测试配置文件是否有语法错误。

# 测试配置语法
sudo apache2ctl configtest  # Debian/Ubuntu
# 或者
sudo apachectl configtest   # CentOS/RHEL
# 如果输出 "Syntax OK",说明配置正确。

如果一切正常,重启 Apache 服务使配置生效。

# Debian/Ubuntu
sudo systemctl restart apache2
# CentOS/RHEL
sudo systemctl restart httpd

步骤 7:配置 DNS 和本地 hosts 文件(用于测试)

要让你的电脑能访问这两个新网站,需要进行域名解析。

  1. DNS 配置: 登录你的域名注册商(如 GoDaddy, Namecheap 等)的管理后台,将 siteA.comsiteB.org 的 A 记录指向你的服务器公网 IP 地址。

  2. 本地 hosts 文件(仅用于本地测试): 如果你还没有配置 DNS,或者只想在本地电脑上测试,可以修改你电脑的 hosts 文件。

    • Windows: C:\Windows\System32\drivers\etc\hosts
    • macOS/Linux: /etc/hosts

    在文件末尾添加以下内容(将 YOUR_SERVER_IP 替换为你的服务器 IP):

    YOUR_SERVER_IP   siteA.com
    YOUR_SERVER_IP   www.siteA.com
    YOUR_SERVER_IP   siteB.org
    YOUR_SERVER_IP   www.siteB.org

在浏览器中访问 http://siteA.comhttp://siteB.org,你应该能看到各自不同的首页内容了!


基于IP的虚拟主机

这种方法为每个网站分配一个独立的 IP 地址,当服务器有多个网卡或多个 IP 地址时,这种方法很有用,但现在因为 IPv4 地址稀缺,使用得较少。

步骤:

  1. 为服务器配置多个 IP 地址:假设你的服务器有两个 IP 地址:168.1.10168.1.11
  2. 为每个网站创建目录:与方法一相同。
  3. 创建配置文件:每个虚拟主机配置块监听不同的 IP 地址。

示例配置:

# 第一个网站,监听 IP 192.168.1.10
<VirtualHost 192.168.1.10:80>
    ServerName siteA.com
    DocumentRoot /var/www/siteA.com/html
    ErrorLog logs/siteA.com_error.log
    CustomLog logs/siteA.com_access.log combined
</VirtualHost>
# 第二个网站,监听 IP 192.168.1.11
<VirtualHost 192.168.1.11:80>
    ServerName siteB.org
    DocumentRoot /var/www/siteB.org/html
    ErrorLog logs/siteB.org_error.log
    CustomLog logs/siteB.org_access.log combined
</VirtualHost>

配置完成后,同样需要测试并重启 Apache。


总结与最佳实践

特性 基于名称的虚拟主机 基于IP的虚拟主机
适用场景 绝大多数情况,节省 IP 地址 需要基于 IP 进行隔离或加密
所需资源 一个 IP 地址 多个 IP 地址
配置方式 通过 ServerNameServerAlias 通过 <VirtualHost IP:PORT>
HTTPS支持 完美支持,可以通过 SNI (Server Name Indication) 在同一个 IP 上为多个网站提供不同的 SSL 证书。 也支持,但需要为每个 IP 分配一个证书。

推荐使用基于名称的虚拟主机。

额外提示:

  • 配置 SSL/HTTPS: 为基于名称的虚拟主机配置 HTTPS 非常普遍,你只需要为每个网站申请 SSL 证书,并在相应的虚拟主机配置块中添加 SSLEngine on, SSLCertificateFile, SSLCertificateKeyFile 等指令即可。
  • 使用模板: 当你需要创建大量虚拟主机时,可以编写一个 Shell 脚本来自动化创建目录、文件和配置模板,大大提高效率。
分享:
扫描分享到社交APP
上一篇
下一篇