Apache 虚拟主机配置

Apache Virtual Host Configuration

概述 (Overview)

虚拟主机是Apache的核心功能之一,允许在单个服务器上托管多个网站。本文将详细介绍基于IP、基于端口和基于域名的虚拟主机配置方法,以及高级配置技巧。

Virtual hosts are one of Apache's core features, allowing multiple websites to be hosted on a single server. This article will detail configuration methods for IP-based, port-based, and name-based virtual hosts, along with advanced configuration techniques.

1. 虚拟主机基础 (Virtual Host Basics)

1.1 虚拟主机类型 (Virtual Host Types)

Apache支持三种类型的虚拟主机:

Apache supports three types of virtual hosts:

  1. 基于IP的虚拟主机 (IP-based Virtual Hosts)

    • 每个网站使用不同的IP地址
    • 需要服务器具备多个IP地址
    • 每个IP地址对应一个网站
  2. 基于端口的虚拟主机 (Port-based Virtual Hosts)

    • 每个网站使用不同的端口号
    • 所有网站共享同一IP地址
    • 访问时需要指定端口号
  3. 基于域名的虚拟主机 (Name-based Virtual Hosts)

    • 最常用的方式
    • 多个域名共享同一IP地址
    • 根据HTTP请求中的Host头区分网站

1.2 虚拟主机配置语法 (Virtual Host Configuration Syntax)

# 虚拟主机基本语法
<VirtualHost addr[:port] [addr[:port]] ...>
    # 虚拟主机配置指令
</VirtualHost>

2. 基于IP的虚拟主机 (IP-based Virtual Hosts)

2.1 配置示例 (Configuration Example)

# 假设服务器有两个IP地址: 192.168.1.100 和 192.168.1.101

# 网站A配置
<VirtualHost 192.168.1.100:80>
    ServerName www.siteA.com
    DocumentRoot /var/www/siteA
    ErrorLog /var/log/apache2/siteA_error.log
    CustomLog /var/log/apache2/siteA_access.log combined
</VirtualHost>

# 网站B配置
<VirtualHost 192.168.1.101:80>
    ServerName www.siteB.com
    DocumentRoot /var/www/siteB
    ErrorLog /var/log/apache2/siteB_error.log
    CustomLog /var/log/apache2/siteB_access.log combined
</VirtualHost>

2.2 网络配置 (Network Configuration)

# 在Linux系统中添加IP别名
sudo ip addr add 192.168.1.101/24 dev eth0

# 永久配置 (Ubuntu/Debian)
echo "auto eth0:1" >> /etc/network/interfaces
echo "iface eth0:1 inet static" >> /etc/network/interfaces
echo "address 192.168.1.101" >> /etc/network/interfaces
echo "netmask 255.255.255.0" >> /etc/network/interfaces

3. 基于端口的虚拟主机 (Port-based Virtual Hosts)

3.1 配置示例 (Configuration Example)

# 监听额外端口
Listen 8080

# 主网站 (默认端口80)
<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /var/www/main
    ErrorLog /var/log/apache2/main_error.log
    CustomLog /var/log/apache2/main_access.log combined
</VirtualHost>

# 次要网站 (端口8080)
<VirtualHost *:8080>
    ServerName www.example.com
    DocumentRoot /var/www/secondary
    ErrorLog /var/log/apache2/secondary_error.log
    CustomLog /var/log/apache2/secondary_access.log combined
</VirtualHost>

3.2 访问方式 (Access Method)

# 访问主网站
http://www.example.com/

# 访问次要网站
http://www.example.com:8080/

4. 基于域名的虚拟主机 (Name-based Virtual Hosts)

4.1 基本配置 (Basic Configuration)

# 启用NameVirtualHost (Apache 2.2及更早版本)
NameVirtualHost *:80

# 虚拟主机配置
<VirtualHost *:80>
    ServerName www.siteA.com
    ServerAlias siteA.com *.siteA.com
    DocumentRoot /var/www/siteA
    ErrorLog /var/log/apache2/siteA_error.log
    CustomLog /var/log/apache2/siteA_access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerName www.siteB.com
    ServerAlias siteB.com shop.siteB.com
    DocumentRoot /var/www/siteB
    ErrorLog /var/log/apache2/siteB_error.log
    CustomLog /var/log/apache2/siteB_access.log combined
</VirtualHost>

4.2 高级配置选项 (Advanced Configuration Options)

<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /var/www/example

    # 目录特定配置
    <Directory "/var/www/example">
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted

        # PHP配置
        php_admin_value open_basedir /var/www/example:/tmp
        php_admin_value upload_tmp_dir /var/www/example/tmp
    </Directory>

    # 自定义错误页面
    ErrorDocument 404 /errors/404.html
    ErrorDocument 500 /errors/500.html

    # 重写规则
    RewriteEngine On
    RewriteRule ^/old-page\.html$ /new-page.html [R=301,L]

    # 日志配置
    ErrorLog /var/log/apache2/example_error.log
    CustomLog /var/log/apache2/example_access.log combined
    CustomLog /var/log/apache2/example_referer.log "%{Referer}i -> %U"
</VirtualHost>

5. 虚拟主机目录结构 (Virtual Host Directory Structure)

# 推荐的虚拟主机目录结构
/var/www/
├── siteA.com/
│   ├── public_html/          # 网站根目录
│   ├── logs/                 # 网站日志
│   ├── backups/              # 网站备份
│   └── ssl/                  # SSL证书
├── siteB.com/
│   ├── public_html/
│   ├── logs/
│   ├── backups/
│   └── ssl/
└── default/                  # 默认网站
    ├── public_html/
    └── logs/

5.2 权限设置 (Permission Settings)

# 设置目录权限
sudo chown -R www-data:www-data /var/www/siteA.com
sudo chmod -R 755 /var/www/siteA.com

# 设置特定目录权限
sudo chmod 700 /var/www/siteA.com/ssl
sudo chmod 600 /var/www/siteA.com/ssl/*.key

6. SSL虚拟主机 (SSL Virtual Hosts)

6.1 HTTPS虚拟主机配置 (HTTPS Virtual Host Configuration)

# 监听HTTPS端口
Listen 443

# SSL虚拟主机
<VirtualHost *:443>
    ServerName secure.example.com
    DocumentRoot /var/www/secure

    # SSL配置
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/example.com.crt
    SSLCertificateKeyFile /etc/ssl/private/example.com.key
    SSLCertificateChainFile /etc/ssl/certs/example.com.ca-bundle

    # SSL安全设置
    SSLProtocol all -SSLv2 -SSLv3
    SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
    SSLHonorCipherOrder on

    # 日志配置
    ErrorLog /var/log/apache2/secure_error.log
    CustomLog /var/log/apache2/secure_access.log combined
</VirtualHost>

6.2 同时支持HTTP和HTTPS (Support Both HTTP and HTTPS)

# HTTP虚拟主机 (重定向到HTTPS)
<VirtualHost *:80>
    ServerName secure.example.com
    Redirect permanent / https://secure.example.com/
</VirtualHost>

# HTTPS虚拟主机
<VirtualHost *:443>
    ServerName secure.example.com
    DocumentRoot /var/www/secure

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/example.com.crt
    SSLCertificateKeyFile /etc/ssl/private/example.com.key

    # 其他配置...
</VirtualHost>

7. 虚拟主机管理脚本 (Virtual Host Management Scripts)

7.1 创建虚拟主机脚本 (Create Virtual Host Script)

#!/bin/bash
# create-vhost.sh

create_vhost() {
    local domain=$1
    local docroot=$2
    local email=${3:-admin@$domain}

    # 创建目录结构
    sudo mkdir -p /var/www/$domain/public_html
    sudo mkdir -p /var/www/$domain/logs

    # 设置权限
    sudo chown -R www-data:www-data /var/www/$domain
    sudo chmod -R 755 /var/www/$domain

    # 创建示例页面
    cat > /var/www/$domain/public_html/index.html << EOF
<!DOCTYPE html>
<html>
<head>
    <title>Welcome to $domain</title>
</head>
<body>
    <h1>Success! Virtual host is working!</h1>
    <p>Domain: $domain</p>
</body>
</html>
EOF

    # 创建虚拟主机配置文件
    cat > /etc/apache2/sites-available/$domain.conf << EOF
<VirtualHost *:80>
    ServerName $domain
    ServerAlias www.$domain
    ServerAdmin $email
    DocumentRoot /var/www/$domain/public_html

    <Directory /var/www/$domain/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog /var/www/$domain/logs/error.log
    CustomLog /var/www/$domain/logs/access.log combined
</VirtualHost>
EOF

    # 启用站点
    sudo a2ensite $domain.conf

    echo "Virtual host $domain created successfully!"
    echo "Document root: /var/www/$domain/public_html"
    echo "Configuration file: /etc/apache2/sites-available/$domain.conf"
    echo "Remember to run 'sudo systemctl reload apache2' to apply changes"
}

# 检查参数
if [ $# -lt 2 ]; then
    echo "Usage: $0 <domain> <document_root> [admin_email]"
    exit 1
fi

create_vhost $1 $2 $3

7.2 虚拟主机状态检查脚本 (Virtual Host Status Check Script)

#!/bin/bash
# vhost-status.sh

check_vhost_status() {
    echo "=== Apache Virtual Host Status ==="

    # 列出已启用的站点
    echo "Enabled sites:"
    ls -1 /etc/apache2/sites-enabled/ | while read site; do
        echo "  - $site"
    done

    echo
    echo "Virtual Host Configuration:"
    apache2ctl -S 2>/dev/null

    echo
    echo "Testing virtual hosts:"

    # 测试每个虚拟主机
    for conf in /etc/apache2/sites-available/*.conf; do
        domain=$(basename $conf .conf)
        if [ -L "/etc/apache2/sites-enabled/$domain.conf" ]; then
            echo "  ✓ $domain (enabled)"
            # 检查文档根目录
            docroot=$(grep -i documentroot $conf | head -1 | awk '{print $2}')
            if [ -d "$docroot" ]; then
                echo "    DocumentRoot: $docroot (exists)"
            else
                echo "    DocumentRoot: $docroot (MISSING!)"
            fi
        else
            echo "  ✗ $domain (disabled)"
        fi
    done
}

check_vhost_status

8. 故障排除 (Troubleshooting)

8.1 常见问题 (Common Issues)

# 1. 检查配置语法
sudo apache2ctl configtest

# 2. 查看虚拟主机配置
sudo apache2ctl -S

# 3. 检查错误日志
sudo tail -f /var/log/apache2/error.log

# 4. 测试特定虚拟主机
curl -H "Host: www.example.com" http://localhost/

8.2 调试技巧 (Debugging Tips)

# 启用详细日志记录进行调试
LogLevel debug

# 在虚拟主机中添加调试信息
<VirtualHost *:80>
    # ... 其他配置 ...

    # 添加调试头
    Header set X-VirtualHost "siteA"

    # 记录更多详细信息
    LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" \"%{Host}i\"" vhost_combined
    CustomLog /var/log/apache2/debug_access.log vhost_combined
</VirtualHost>

小结 (Summary)

通过本文学习,你应该掌握:

  1. 三种虚拟主机类型的特点和配置方法
  2. 基于域名的虚拟主机的高级配置技巧
  3. SSL虚拟主机的配置和安全设置
  4. 虚拟主机目录结构的最佳实践
  5. 虚拟主机管理脚本的使用
  6. 常见问题的诊断和解决方法

虚拟主机是Web服务器管理的核心技能,正确的配置能够最大化服务器资源利用率。在下一篇文章中,我们将深入探讨Apache的核心配置选项。

powered by Gitbook© 2025 编外计划 | 最后修改: 2025-08-29 15:40:15

results matching ""

    No results matching ""