一、什么是Apache虚拟主机?
Apache虚拟主机(Virtual Host)是指在一台物理服务器上运行多个网站的技术。通过虚拟主机,您可以用一台服务器同时托管多个域名(如 example.com、test.com、blog.example.com)。
核心优势:
– 💰 降低成本:一台服务器托管多个网站
– 🎯 资源高效利用:充分利用服务器资源
– 🔧 管理便捷:统一管理和维护
– 📈 灵活扩展:随时添加/删除网站
二、虚拟主机类型
| 类型 | 原理 | 适用场景 |
|---|---|---|
| 基于域名 | 根据HTTP请求头中的域名区分 | 最常用,适合大多数场景 |
| 基于IP | 根据访问的IP地址区分 | 需要多个独立IP的场景 |
| 基于端口 | 根据访问的端口区分 | 内部测试、特殊应用 |
三、环境准备
3.1 安装LAMP环境
# Ubuntu/Debian
sudo apt update
sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql -y
# CentOS/RHEL
sudo yum install httpd mariadb-server php php-mysql -y
sudo systemctl start httpd
sudo systemctl enable httpd
3.2 检查Apache状态
# Ubuntu/Debian
sudo systemctl status apache2
# CentOS/RHEL
sudo systemctl status httpd
# 测试Apache是否正常运行
curl http://localhost
四、配置基于域名的虚拟主机(推荐)
4.1 创建网站目录
# 创建网站根目录
sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/www/test.com/public_html
# 设置权限
sudo chown -R $USER:$USER /var/www/example.com/public_html
sudo chown -R $USER:$USER /var/www/test.com/public_html
sudo chmod -R 755 /var/www
# 创建测试页面
echo "<h1>Welcome to example.com</h1>" > /var/www/example.com/public_html/index.html
echo "<h1>Welcome to test.com</h1>" > /var/www/test.com/public_html/index.html
4.2 创建虚拟主机配置文件
Ubuntu/Debian (/etc/apache2/sites-available/example.com.conf):
<VirtualHost *:80>
ServerAdmin webmaster@example.com
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
<Directory /var/www/example.com/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined
</VirtualHost>
CentOS/RHEL (/etc/httpd/conf.d/example.com.conf):
<VirtualHost *:80>
ServerAdmin webmaster@example.com
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
<Directory /var/www/example.com/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/httpd/example.com_error.log
CustomLog /var/log/httpd/example.com_access.log combined
</VirtualHost>
4.3 配置第二个网站
创建 /etc/apache2/sites-available/test.com.conf(Ubuntu/Debian):
<VirtualHost *:80>
ServerAdmin webmaster@test.com
ServerName test.com
ServerAlias www.test.com
DocumentRoot /var/www/test.com/public_html
<Directory /var/www/test.com/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/test.com_error.log
CustomLog ${APACHE_LOG_DIR}/test.com_access.log combined
</VirtualHost>
4.4 启用虚拟主机
Ubuntu/Debian:
# 启用虚拟主机配置
sudo a2ensite example.com.conf
sudo a2ensite test.com.conf
# 禁用默认站点(可选)
sudo a2dissite 000-default.conf
# 测试配置
sudo apache2ctl configtest
# 重启Apache
sudo systemctl restart apache2
CentOS/RHEL:
# 测试配置
sudo httpd -t
# 重启Apache
sudo systemctl restart httpd
五、本地测试(无域名时)
5.1 修改本地hosts文件
Linux/Mac (/etc/hosts):
127.0.0.1 example.com
127.0.0.1 test.com
Windows (C:\Windows\System32\drivers\etc\hosts):
127.0.0.1 example.com
127.0.0.1 test.com
5.2 测试访问
# 测试第一个网站
curl http://example.com
# 测试第二个网站
curl http://test.com
六、配置SSL/HTTPS(Let’s Encrypt)
6.1 安装Certbot
# Ubuntu/Debian
sudo apt install certbot python3-certbot-apache -y
# CentOS/RHEL
sudo yum install certbot python3-certbot-apache -y
6.2 获取SSL证书
# 为example.com获取证书
sudo certbot --apache -d example.com -d www.example.com
# 为test.com获取证书
sudo certbot --apache -d test.com -d www.test.com
6.3 自动续期
# 测试自动续期
sudo certbot renew --dry-run
# Certbot会自动添加cron任务或systemd定时器来自动续期
配置SSL后,虚拟主机配置文件会自动更新,添加443端口的虚拟主机配置。
七、配置PHP支持
7.1 测试PHP
创建 info.php 文件:
echo "<?php phpinfo(); ?>" > /var/www/example.com/public_html/info.php
访问 http://example.com/info.php,应显示PHP信息页面。
7.2 配置PHP上传限制
编辑 php.ini:
# Ubuntu/Debian
sudo nano /etc/php/8.1/apache2/php.ini
# CentOS/RHEL
sudo nano /etc/php.ini
修改以下配置:
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 300
重启Apache使配置生效。
八、配置URL重写(伪静态)
8.1 启用mod_rewrite
# Ubuntu/Debian
sudo a2enmod rewrite
sudo systemctl restart apache2
# CentOS/RHEL
# mod_rewrite默认已启用
8.2 配置.htaccess
在网站根目录创建 .htaccess 文件:
# 启用URL重写
RewriteEngine On
# 将 www.example.com 重定向到 example.com
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
# 隐藏 index.php(适用于ThinkPHP、Laravel等框架)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
九、性能优化
9.1 启用Apache缓存
# 在虚拟主机配置中添加
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresDefault "access plus 7 days"
</IfModule>
9.2 启用Gzip压缩
# 在虚拟主机配置中添加
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/xml
</IfModule>
9.3 配置MPM Prefork(优化并发)
编辑 /etc/apache2/mods-available/mpm_prefork.conf(Ubuntu/Debian):
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
根据服务器内存调整 MaxRequestWorkers:
– 2GB内存:约150
– 4GB内存:约300
– 8GB内存:约600
十、常见问题与解决方案
Q1: 访问网站显示默认页面而非我的网站?
A: 可能原因:
1. 虚拟主机配置未启用:sudo a2ensite example.com.conf
2. 配置语法错误:运行 sudo apache2ctl configtest 检查
3. 未重启Apache:sudo systemctl restart apache2
Q2: 403 Forbidden 错误?
A: 可能原因:
1. 目录权限不正确:运行 sudo chmod -R 755 /var/www
2. SELinux未关闭(CentOS):sudo setenforce 0
3. 配置文件中 Require all granted 缺失
Q3: 域名已解析但无法访问?
A: 检查步骤:
# 1. 检查域名解析
nslookup example.com
# 2. 检查Apache是否监听80端口
sudo netstat -tulpn | grep :80
# 3. 检查防火墙
sudo ufw status # Ubuntu
sudo firewall-cmd --list-all # CentOS
Q4: 如何配置HTTPS重定向?
A: 在虚拟主机配置中添加:
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
十一、总结
Apache虚拟主机是LAMP环境下托管多个网站的核心技术。通过基于域名的虚拟主机配置,您可以高效地在一台服务器上运行多个网站。
核心步骤回顾:
1. 安装LAMP环境
2. 创建网站目录
3. 配置虚拟主机文件
4. 启用配置并重启Apache
5. 配置SSL证书(推荐)
6. 优化性能和安全性
本文基于2026年主流Linux发行版和Apache 2.4编写,具体配置请参考官方文档。