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:
基于IP的虚拟主机 (IP-based Virtual Hosts)
- 每个网站使用不同的IP地址
- 需要服务器具备多个IP地址
- 每个IP地址对应一个网站
基于端口的虚拟主机 (Port-based Virtual Hosts)
- 每个网站使用不同的端口号
- 所有网站共享同一IP地址
- 访问时需要指定端口号
基于域名的虚拟主机 (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)
5.1 推荐目录布局 (Recommended Directory Layout)
# 推荐的虚拟主机目录结构
/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)
通过本文学习,你应该掌握:
- 三种虚拟主机类型的特点和配置方法
- 基于域名的虚拟主机的高级配置技巧
- SSL虚拟主机的配置和安全设置
- 虚拟主机目录结构的最佳实践
- 虚拟主机管理脚本的使用
- 常见问题的诊断和解决方法
虚拟主机是Web服务器管理的核心技能,正确的配置能够最大化服务器资源利用率。在下一篇文章中,我们将深入探讨Apache的核心配置选项。