Apache 虚拟主机配置教程:一台服务器部署多个网站的完整步骤与常见问题

适用场景与准备工作

虚拟主机配置并不是只有专业运维才会遇到的活。常见的场景有几种:一台云服务器上要同时跑多个网站,各自绑定不同域名;从虚拟主机或 cPanel 空间迁移到云服务器,需要把原来的多站点环境重新搭起来;使用 LAMP 一键包、cPanel 面板或者直接编译安装的环境,默认采用的就是 Apache。只要服务器上同时存在多个站点,就离不开虚拟主机(VirtualHost)配置。

开始之前先做四项检查:确认系统版本(本文以 Ubuntu 22.04 和 CentOS 7/8 为例,Debian 与 Ubuntu 操作一致);确认有 root 权限或 sudo 权限;确认域名已经解析到服务器公网 IP;确认 Apache 是否已经安装,可执行 apachectl -v 或 httpd -v 查看版本。需要特别提醒的是,修改任何 Apache 配置文件之前,先把原文件复制一份备份(例如 cp httpd.conf httpd.conf.bak),生产环境的服务器更要先评估改动影响,避免直接重启导致业务中断。

第一步:安装 Apache 并认识配置目录

如果服务器上还没有 Apache,可以先用包管理器安装。Ubuntu/Debian 系统执行 apt 安装 apache2,CentOS/RHEL 系统执行 yum 安装 httpd,装完启动服务并设置开机自启。安装完成后用浏览器访问服务器 IP,看到 Apache 默认欢迎页,就说明安装成功。

两个系统的配置目录结构有明显差异,找错目录是新手最常踩的坑。Debian/Ubuntu 的站点配置放在 /etc/apache2/sites-available 目录,启用后的软链接出现在 /etc/apache2/sites-enabled;而 CentOS/RHEL 采用 /etc/httpd/conf.d 目录,把 .conf 文件放进去就会被自动加载。网站文件默认放在 /var/www/html,多站点建议按域名建立子目录,例如 /var/www/site1、/var/www/site2,方便后期维护。

# Ubuntu / Debian
sudo apt update && sudo apt install -y apache2
sudo systemctl enable --now apache2
apachectl -v

# CentOS / RHEL
sudo yum install -y httpd
sudo systemctl enable --now httpd
httpd -v

第二步:创建虚拟主机,一台服务器部署多个网站

以 Ubuntu 为例,为第一个站点创建配置文件 /etc/apache2/sites-available/site1.conf。核心是 VirtualHost 容器:ServerName 填写站点主域名,ServerAlias 填写附加域名(如带 www 的域名),DocumentRoot 指向网站文件目录。容器内的 Directory 块用于授予 Apache 读取该目录的权限,其中 Options 控制目录行为,AllowOverride 决定是否允许 .htaccess 覆盖配置,Require all granted 表示允许外部访问。

接着创建网站目录并放一个测试页面,把目录属主改为 Web 运行用户(Debian/Ubuntu 是 www-data,CentOS 是 apache),然后用 a2ensite site1 启用站点。CentOS 系统则把同样的配置写入 /etc/httpd/conf.d/site1.conf,不需要额外启用命令。以后每新增一个网站,就复制一份配置、修改 ServerName 和 DocumentRoot,多个虚拟主机可以同时存在,互不影响。

# 用编辑器创建站点配置:/etc/apache2/sites-available/site1.conf
<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName www.example.com
    ServerAlias example.com
    DocumentRoot /var/www/site1

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

    ErrorLog ${APACHE_LOG_DIR}/site1_error.log
    CustomLog ${APACHE_LOG_DIR}/site1_access.log combined
</VirtualHost>
# 创建网站目录与测试页
sudo mkdir -p /var/www/site1
echo '<h1>site1 works</h1>' | sudo tee /var/www/site1/index.html
sudo chown -R www-data:www-data /var/www/site1

# 启用站点(Ubuntu/Debian)
sudo a2ensite site1

# CentOS 用户将配置放入 conf.d 后无需此步:
# sudo cp site1.conf /etc/httpd/conf.d/
数据中心机架式服务器特写
图:数据中心机架式服务器,一台服务器部署多个网站是虚拟主机配置的典型场景

第三步:.htaccess 伪静态与 WordPress 固定链接

很多站长在 Apache 上部署 WordPress 后,一切换固定链接就出现 404,原因大多出在 AllowOverride。Apache 默认不允许 .htaccess 覆盖主配置(AllowOverride None),而 WordPress 的伪静态规则恰恰写在 .htaccess 里。需要先在虚拟主机的 Directory 块中把 AllowOverride 改成 All,并启用 rewrite 模块,规则文件才会生效。

WordPress 的 .htaccess 有标准写法,放在网站根目录即可。在后台「设置 - 固定链接」保存后,WordPress 会尝试自动写入这段规则;如果文件权限不足写不进去,也可以按下面的内容手动创建。改完配置别忘了执行一次语法检查并重载服务,让新规则真正加载进来。

# 启用 rewrite 模块(Ubuntu/Debian)
sudo a2enmod rewrite

# 网站根目录下的 .htaccess,WordPress 标准规则
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

# 检查语法并重载
sudo apachectl configtest && sudo systemctl reload apache2

第四步:语法检查、重启服务与访问验证

配置改完后不要急着重启,先执行 apachectl configtest(CentOS 下用 httpd -t 同样有效)。输出 Syntax OK 才说明配置文件没有语法错误;如果有问题,会提示出错的文件和行号,按提示修正即可。这一步能挡住绝大多数「重启失败导致网站全挂」的事故。

确认无误后再重启或重载服务。重启(restart)会中断所有连接,生产环境建议优先使用重载(reload 或 graceful),它只重新加载配置、不中断现有请求。之后用 curl -I http://你的域名 检查返回码,200 表示正常,再用浏览器直接访问确认页面内容。如果打不开,错误日志是最快的排查入口:Ubuntu 在 /var/log/apache2/,CentOS 在 /var/log/httpd/。

# 语法检查
sudo apachectl configtest

# 生产环境优先 reload,改动较大时再 restart
sudo systemctl reload apache2    # Ubuntu/Debian
sudo systemctl reload httpd      # CentOS/RHEL

# 验证访问与查看日志
curl -I http://www.example.com
tail -f /var/log/apache2/site1_error.log

常见问题(FAQ)

问题一:所有域名打开的都是同一个站点?这是因为 Apache 把第一个加载的虚拟主机当作默认站点,没有匹配到 ServerName 的流量都会落到它头上。检查新站点的 ServerName 是否写对、配置文件是否真的被加载(Ubuntu 检查 sites-enabled 目录是否有对应软链接),并清除浏览器缓存或换无痕窗口再试。

问题二:访问站点提示 403 Forbidden?常见原因有三类:网站目录下缺少 index.html 或 index.php,而目录列表又被 Options -Indexes 关闭;目录属主不对,www-data 或 apache 用户读不了文件;SELinux 处于强制模式时安全上下文不正确。按「先看错误日志、再查目录权限、最后看 SELinux」的顺序排查即可。

问题三:.htaccess 不生效,固定链接还是 404?先确认 Directory 块里的 AllowOverride 已改为 All、rewrite 模块已启用,这两个条件缺一不可;其次确认 .htaccess 文件确实位于网站根目录、内容没有多余空行;最后执行 apachectl configtest 并 reload 服务,「改完不重载」是最典型的假故障。

问题四:重启 Apache 失败,服务起不来?先用 apachectl configtest 看具体报错行,九成是括号不配对、引号未闭合这类语法问题;如果语法正常,检查 80/443 端口是否被其他进程占用(ss -tlnp | grep -E ':80|:443'),常见冲突源是 Nginx 或另一个 Apache 实例。修好之前不要反复重启,带着报错信息改文件更高效。

总结

Apache 虚拟主机的配置可以归结为四步:装好 Apache 并认清两个系统的配置目录;为每个站点写一份 VirtualHost 配置并启用;按需打开 .htaccess 伪静态支持;先用 configtest 检查、再 reload 生效。整个过程不涉及复杂命令,真正的风险在于盲目重启和改前不备份,养成「先备份、先测试、后重启」的习惯,多站点环境就能长期稳定运行。

本文只覆盖了 HTTP 场景,站点正式上线前还建议继续两步:用 Let's Encrypt 给每个虚拟主机配置 HTTPS 证书,以及按需调整 MPM 与 keepalive 参数。后续可以对照本站的 Nginx 反向代理、HTTPS 强制跳转等教程,把整台服务器的 Web 层配置逐步补齐。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容