2026年Ubuntu LAMP虚拟主机配置完全指南:从基础到实战(2026)

一、为什么需要虚拟主机配置

在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虚拟主机是托管多个网站的关键技能。通过本文的介绍,您应该能够:

  1. 配置基于域名的虚拟主机:最常用的方式
  2. 配置基于端口的虚拟主机:用于特殊应用
  3. 配置基于IP的虚拟主机:用于多IP服务器
  4. 部署SSL证书:启用HTTPS安全访问
  5. 优化和管理:提升性能和安全

关键要点

  • 使用a2ensite/a2dissite管理虚拟主机
  • 每个虚拟主机使用独立的日志文件
  • 配置SSL证书并启用自动续期
  • 定期检查日志和性能
  • 做好备份和恢复计划

注:本文基于Ubuntu 22.04 LTS、Apache 2.4、PHP 8.2编写。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注