一、为什么需要虚拟主机配置
在Ubuntu服务器上部署LAMP(Linux + Apache + MySQL + PHP)环境后,单个服务器通常需要托管多个网站。Apache的虚拟主机(Virtual Host)功能允许:
- 单服务器托管多网站:用同一个Apache实例服务多个域名
- 资源高效利用:避免为每个网站配置独立服务器
- 灵活管理:不同网站使用不同配置、日志和证书
- 成本节约:共享硬件和软件资源
本文详细介绍在Ubuntu LAMP环境下配置Apache虚拟主机的完整流程,涵盖基于域名、基于端口、基于IP的虚拟主机配置方法。
二、LAMP环境准备
2.1 安装Apache
# 更新软件包索引
sudo apt update
# 安装Apache Web服务器
sudo apt install apache2 -y
# 检查Apache状态
sudo systemctl status apache2
# 允许HTTP/HTTPS流量通过防火墙
sudo ufw allow in "Apache Full"
sudo ufw reload
2.2 安装MySQL数据库
# 安装MySQL服务器
sudo apt install mysql-server -y
# 运行安全脚本
sudo mysql_secure_installation
# 验证MySQL运行
sudo systemctl status mysql
2.3 安装PHP
# 安装PHP和常用模块
sudo apt install php libapache2-mod-php php-mysql php-gd php-curl php-mbstring php-xml php-xmlrpc php-zip php-intl -y
# 验证PHP安装
php -v
2.4 验证LAMP环境
# 创建测试PHP文件
echo "" | sudo tee /var/www/html/info.php
# 访问测试
curl http://localhost/info.php
# 删除测试文件(安全)
sudo rm /var/www/html/info.php
三、基于域名的虚拟主机配置
3.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
sudo chown -R $USER:$USER /var/www/test.com
sudo chmod -R 755 /var/www
3.2 创建测试页面
# 为example.com创建测试页面
cat > /var/www/example.com/public_html/index.html <
<DOCTYPE html>
<htl>
<head>
<title>Example.com</title>
</head>
<body>
<h1>Welcome to Example.com!</h1>
</body>
</html>
EOF
# 为test.com创建测试页面
cat > /var/www/test.com/public_html/index.html <
<DOCTYPE html>
<htl>
<head>
<title>Test.com</title>
</head>
<body>
<h1>Welcome to Test.com!</h1>
</body>
</html>
EOF
3.3 创建虚拟主机配置文件
# 为example.com创建虚拟主机配置
sudo nano /etc/apache2/sites-available/example.com.conf
配置内容:
<VirtualHost *:80>
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>
# 为test.com创建虚拟主机配置
sudo nano /etc/apache2/sites-available/test.com.conf
配置内容:
<VirtualHost *:80>
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>
3.4 启用虚拟主机和模块
# 启用虚拟主机配置
sudo a2ensite example.com.conf
sudo a2ensite test.com.conf
# 启用重写模块
sudo a2enmod rewrite
# 测试Apache配置
sudo apache2ctl configtest
# 重启Apache
sudo systemctl restart apache2
3.5 本地hosts文件测试
# 编辑本地hosts文件(测试用)
sudo nano /etc/hosts
# 添加以下内容(替换为服务器IP)
192.168.1.100 example.com
192.168.1.100 www.example.com
192.168.1.100 test.com
192.168.1.100 www.test.com
# 保存后测试访问
curl http://example.com
curl http://test.com
四、基于端口的虚拟主机配置
4.1 编辑ports.conf
sudo nano /etc/apache2/ports.conf
添加监听端口:
# 在文件中添加
Listen 8080
Listen 8081
4.2 创建基于端口的虚拟主机
sudo nano /etc/apache2/sites-available/port-8080.conf
配置内容:
<VirtualHost *:8080>
DocumentRoot /var/www/port-8080
ServerName localhost
<Directory /var/www/port-8080>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/port-8080_error.log
CustomLog ${APACHE_LOG_DIR}/port-8080_access.log combined
</VirtualHost>
# 创建目录和测试页面
sudo mkdir -p /var/www/port-8080
echo "<h1>Port 8080</h1>" | sudo tee /var/www/port-8080/index.html
# 启用配置
sudo a2ensite port-8080.conf
sudo systemctl restart apache2
4.3 测试基于端口的访问
# 测试访问
curl http://localhost:8080
五、基于IP的虚拟主机配置
5.1 添加额外IP地址
# 查看当前网络接口
ip addr show
# 添加次要IP(临时)
sudo ip addr add 192.168.1.101/24 dev eth0
# 永久添加(编辑netplan配置)
sudo nano /etc/netplan/01-netcfg.yaml
配置内容:
network:
version: 2
ethernets:
eth0:
addresses:
- 192.168.1.100/24
- 192.168.1.101/24
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
应用配置:
sudo netplan apply
ip addr show eth0 # 验证IP添加成功
5.2 创建基于IP的虚拟主机
sudo nano /etc/apache2/sites-available/ip-101.conf
配置内容:
<VirtualHost 192.168.1.101:80>
DocumentRoot /var/www/ip-101
ServerName 192.168.1.101
<Directory /var/www/ip-101>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
# 创建目录
sudo mkdir -p /var/www/ip-101
echo "<h1>IP 192.168.1.101</h1>" | sudo tee /var/www/ip-101/index.html
# 启用配置
sudo a2ensite ip-101.conf
sudo systemctl restart apache2
六、配置HTTPS(SSL证书)
6.1 安装Certbot
# 安装Certbot和Apache插件
sudo apt install certbot python3-certbot-apache -y
6.2 获取Let’s Encrypt证书
# 为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 验证自动配置
Certbot会自动修改虚拟主机配置,添加443端口监听和SSL证书路径。验证:
# 查看自动生成的SSL配置
sudo nano /etc/apache2/sites-available/example.com-le-ssl.conf
6.4 设置自动续期
# 测试自动续期
sudo certbot renew --dry-run
# Certbot会自动添加cron任务或systemd定时器
sudo systemctl status certbot.timer
七、虚拟主机管理命令
7.1 启用/禁用虚拟主机
# 启用虚拟主机
sudo a2ensite example.com.conf
# 禁用虚拟主机
sudo a2dissite example.com.conf
# 重启Apache使配置生效
sudo systemctl restart apache2
7.2 测试配置
# 测试Apache配置语法
sudo apache2ctl configtest
# 查看详细错误信息
sudo apache2ctl -t
# 查看启用的模块
apache2ctl -M
7.3 查看日志
# 实时查看访问日志
sudo tail -f /var/log/apache2/example.com_access.log
# 查看错误日志
sudo tail -f /var/log/apache2/example.com_error.log
# 查看Apache主错误日志
sudo tail -f /var/log/apache2/error.log
八、PHP配置优化
8.1 各虚拟主机使用独立PHP配置
# 为example.com创建独立PHP配置
sudo mkdir -p /var/www/example.com/php
sudo nano /var/www/example.com/php/php.ini
配置内容:
; 独立PHP配置 for example.com
upload_max_filesize = 20M
post_max_size = 22M
max_execution_time = 60
memory_limit = 256M
在Apache虚拟主机配置中指定:
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/example.com/public_html
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
# 或使用独立PHP配置
PHPINIDir "/var/www/example.com/php"
</FilesMatch>
</VirtualHost>
8.2 启用Apache的PHP-FPM
# 安装PHP-FPM
sudo apt install php8.2-fpm -y
# 启用相关模块
sudo a2enmod proxy_fcgi setenvif
sudo a2ensite php8.2-fpm.conf
# 重启Apache
sudo systemctl restart apache2
九、安全加固
9.1 限制访问
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example.com/public_html
<Directory /var/www/example.com/public_html/admin>
# 只允许特定IP访问
Require ip 192.168.1.0/24
Require ip 10.0.0.1
</Directory>
</VirtualHost>
9.2 禁用目录浏览
<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
9.3 配置HSTS
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/example.com/public_html
# HSTS头
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# 其他SSL配置...
</VirtualHost>
十、常见问题排查
10.1 虚拟主机不生效
排查步骤:
# 1. 检查虚拟主机是否启用
sudo apache2ctl -S
# 2. 检查配置文件语法
sudo apache2ctl configtest
# 3. 检查DocumentRoot目录是否存在
ls -ld /var/www/example.com/public_html
# 4. 检查文件和目录权限
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com
10.2 403 Forbidden错误
# 检查目录权限
namei -l /var/www/example.com/public_html/index.html
# 检查Apache配置中的目录权限
sudo nano /etc/apache2/sites-available/example.com.conf
# 确保有如下配置
<Directory /var/www/example.com/public_html>
Require all granted
</Directory>
10.3 500 Internal Server Error
# 查看Apache错误日志
sudo tail -f /var/log/apache2/example.com_error.log
# 检查.htaccess语法
sudo nano /var/www/example.com/public_html/.htaccess
# 检查PHP错误日志
sudo tail -f /var/log/php/error.log
十一、性能优化
11.1 启用缓存
<VirtualHost *:80>
ServerName example.com
# 启用缓存
CacheEnable disk /
CacheRoot "/var/cache/apache2"
CacheDefaultExpire 3600
CacheMaxExpire 86400
</VirtualHost>
11.2 启用压缩
# 启用压缩模块
sudo a2enmod deflate
sudo systemctl restart apache2
配置压缩规则:
<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>
11.3 调整Apache MPM配置
# 查看当前MPM模式
apache2ctl -M | grep mpm
# 编辑MPM配置
sudo nano /etc/apache2/mods-available/mpm_prefork.conf
配置内容:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
十二、总结
在Ubuntu LAMP环境下配置Apache虚拟主机是托管多个网站的关键技能。通过本文的介绍,您应该能够:
- 配置基于域名的虚拟主机:最常用的方式
- 配置基于端口的虚拟主机:用于特殊应用
- 配置基于IP的虚拟主机:用于多IP服务器
- 部署SSL证书:启用HTTPS安全访问
- 优化和管理:提升性能和安全
关键要点:
- 使用
a2ensite/a2dissite管理虚拟主机 - 每个虚拟主机使用独立的日志文件
- 配置SSL证书并启用自动续期
- 定期检查日志和性能
- 做好备份和恢复计划
注:本文基于Ubuntu 22.04 LTS、Apache 2.4、PHP 8.2编写。