凌峰创科服务平台

Apache如何配置多个网站?

基于名称的虚拟主机基于 IP 地址的虚拟主机,对于绝大多数个人和商业网站,使用基于名称的虚拟主机是最佳选择。

Apache如何配置多个网站?-图1
(图片来源网络,侵删)

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

虚拟主机是 Apache 的一项功能,它允许你根据不同的域名或 IP 地址,将访问请求指向到服务器上不同的网站目录,这样,当用户访问 www.siteA.com 时,Apache 会提供 A 网站的文件;当访问 www.siteB.com 时,则提供 B 网站的文件。


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

这是最流行的方法,因为它不需要为每个网站分配独立的 IP 地址,所有网站共享同一个 IP 地址。

准备工作

  1. 安装 Apache:如果你的服务器上还没有安装 Apache,请先安装。

    • 在 Debian/Ubuntu 上: sudo apt update && sudo apt install apache2
    • 在 CentOS/RHEL 上: sudo yum install httpd
  2. 创建网站目录:为每个网站创建一个独立的目录来存放其文件。

    Apache如何配置多个网站?-图2
    (图片来源网络,侵删)
    # 为 siteA.com 创建目录
    sudo mkdir -p /var/www/siteA.com/html
    sudo mkdir -p /var/www/siteA.com/log
    # 为 siteB.com 创建目录
    sudo mkdir -p /var/www/siteB.com/html
    sudo mkdir -p /var/www/siteB.com/log
  3. 设置目录权限:确保 Apache 服务进程(通常是 www-dataapache)有权读写这些目录。

    # 在 Debian/Ubuntu 上
    sudo chown -R www-data:www-data /var/www/siteA.com/html /var/www/siteB.com/html
    sudo chmod -R 755 /var/www/siteA.com/html /var/www/siteB.com/html
    # 在 CentOS/RHEL 上
    sudo chown -R apache:apache /var/www/siteA.com/html /var/www/siteB.com/html
    sudo chmod -R 755 /var/www/siteA.com/html /var/www/siteB.com/html
  4. 创建测试首页:在每个网站的 html 目录下创建一个 index.html 文件,以便区分。

    # Site A 的首页
    echo "<h1>Welcome to Site A</h1><p>This is the website for siteA.com</p>" | sudo tee /var/www/siteA.com/html/index.html
    # Site B 的首页
    echo "<h1>Welcome to Site B</h1><p>This is the website for siteB.com</p>" | sudo tee /var/www/siteB.com/html/index.html
  5. 配置域名解析:在你的 DNS 服务器(通常是域名注册商提供的管理面板)上,将 siteA.comsiteB.com 的 A 记录都指向你服务器的公网 IP 地址。

Apache 配置步骤

  1. 启用 mod_vhost_alias 模块

    Apache如何配置多个网站?-图3
    (图片来源网络,侵删)
    • 在 Debian/Ubuntu 上,这个模块通常是默认启用的,你可以用以下命令确认:
      sudo a2query -m vhost_alias

      如果返回 vhost_alias (enabled),则已启用,如果没有,使用 sudo a2enmod vhost_alias 启用它。

    • 在 CentOS/RHEL 上,模块默认已加载。
  2. 创建虚拟主机配置文件

    • 最佳实践:不要直接修改主配置文件 apache2.confhttpd.conf,而是为每个网站创建一个独立的配置文件。

    • 在 Debian/Ubuntu 上:配置文件存放在 /etc/apache2/sites-available/ 目录下。

      # 创建 Site A 的配置文件
      sudo nano /etc/apache2/sites-available/siteA.com.conf
      # 创建 Site B 的配置文件
      sudo nano /etc/apache2/sites-available/siteB.com.conf
    • 在 CentOS/RHEL 上:配置文件存放在 /etc/httpd/conf.d/ 目录下,任何以 .conf 结尾的文件都会被 Apache 自动加载。

      # 创建 Site A 的配置文件
      sudo nano /etc/httpd/conf.d/siteA.com.conf
      # 创建 Site B 的配置文件
      sudo nano /etc/httpd/conf.d/siteB.com.conf
  3. 编写配置文件内容: 下面是 siteA.com.conf 的一个标准配置模板,请将 ServerNameDocumentRoot 替换为你自己的信息。

    <VirtualHost *:80>
        # 网站服务器的名称和可能的别名
        ServerName siteA.com
        ServerAlias www.siteA.com
        # 网站根目录
        DocumentRoot /var/www/siteA.com/html
        # 自定义日志文件路径
        ErrorLog ${APACHE_LOG_DIR}/siteA.com_error.log
        CustomLog ${APACHE_LOG_DIR}/siteA.com_access.log combined
        # 可选:设置目录权限
        <Directory /var/www/siteA.com/html>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>
    </VirtualHost>
    • ServerName:你希望访问这个网站时使用的域名。
    • ServerAlias:其他指向这个网站的域名(www 前缀)。
    • DocumentRoot:存放网站文件的根目录。
    • ErrorLogCustomLog:指定错误日志和访问日志的存放位置,方便排查问题。
    • <Directory ...>:块用于设置 DocumentRoot 目录的访问权限。AllowOverride All 允许使用 .htaccess 文件。

    用同样的方式创建 siteB.com.conf,只需修改 ServerName, ServerAliasDocumentRoot 即可。

  4. 启用并测试配置

    • 在 Debian/Ubuntu 上

      # 启用新创建的站点配置
      sudo a2ensite siteA.com.conf
      sudo a2ensite siteB.com.conf
      # 禁用默认的站点(可选)
      sudo a2dissite 000-default.conf
      # 检查配置文件语法是否正确
      sudo apache2ctl configtest
      # 如果输出 "Syntax OK",则表示配置正确
    • 在 CentOS/RHEL 上:由于文件在 conf.d 目录下会自动加载,无需额外命令。

  5. 重新加载 Apache 服务

    # 在 Debian/Ubuntu 上
    sudo systemctl reload apache2
    # 在 CentOS/RHEL 上
    sudo systemctl reload httpd

当你访问 http://siteA.comhttp://siteB.com 时,应该能看到各自不同的首页内容了。


基于 IP 地址的虚拟主机

这种方法为每个网站分配一个独立的 IP 地址,当一个服务器有多个网络接口,或者需要为每个网站提供 SSL 证书(在 HTTP/1.1 普及前很常见)时,可能会用到,由于 SNI (Server Name Indication) 技术的普及,一个 IP 可以支持多个 HTTPS 网站,所以这种方法已经不那么常见了。

配置步骤

  1. 为服务器配置多个 IP 地址:确保你的服务器已经配置了多个公网或内网 IP 地址。

    • 168.1.10 给 siteA,168.1.11 给 siteB。
  2. 创建网站目录:和方法一一样,为每个网站创建独立的目录。

  3. 创建虚拟主机配置文件:配置文件的结构与基于名称的类似,但 <VirtualHost> 指令中要指定具体的 IP 地址和端口。

    # 为 siteA.com (IP: 192.168.1.10) 创建配置
    <VirtualHost 192.168.1.10:80>
        ServerName siteA.com
        DocumentRoot /var/www/siteA.com/html
        ErrorLog /var/log/apache2/siteA.com_error.log
        CustomLog /var/log/apache2/siteA.com_access.log combined
    </VirtualHost>
    # 为 siteB.com (IP: 192.168.1.11) 创建配置
    <VirtualHost 192.168.1.11:80>
        ServerName siteB.com
        DocumentRoot /var/www/siteB.com/html
        ErrorLog /var/log/apache2/siteB.com_error.log
        CustomLog /var/log/apache2/siteB.com_access.log combined
    </VirtualHost>
  4. 重启 Apache 服务

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

故障排除

如果配置完成后网站无法访问,请按以下步骤检查:

  1. 检查 DNS:使用 dig siteA.comnslookup siteA.com 确保域名已正确解析到服务器的 IP 地址。
  2. 检查防火墙:确保服务器的防火墙(如 ufw, firewalld 或云服务商的安全组)允许 HTTP (80) 和 HTTPS (443) 端口的入站流量。
    • UFW: sudo ufw allow 'Apache Full'
    • Firewalld: sudo firewall-cmd --permanent --add-service=http && sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reload
  3. 检查 Apache 服务状态
    • sudo systemctl status apache2 (Debian/Ubuntu)
    • sudo systemctl status httpd (CentOS/RHEL) 确保服务是 active (running) 状态。
  4. 检查日志文件:这是最关键的步骤,查看你配置的 ErrorLog 文件,里面会记录详细的错误信息,帮助你定位问题。
    • tail -f /var/log/apache2/siteA.com_error.log
  5. 检查配置语法:在重启或重载服务前,务必运行 apache2ctl configtestapachectl configtest 检查语法错误。
特性 基于名称的虚拟主机 基于IP地址的虚拟主机
适用场景 绝大多数情况,节省 IP 资源 需要为每个网站分配独立 IP 的旧系统
实现方式 通过 ServerName 匹配域名 通过 IP 地址匹配
资源消耗 低,一个 IP 即可 高,每个网站需要一个 IP
配置 更灵活,更常用 较为传统,不常用

对于绝大多数用户来说,请优先选择和使用基于名称的虚拟主机,它高效、灵活且是现代 Web 托管的标准做法。

分享:
扫描分享到社交APP
上一篇
下一篇