一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Linux Apache 虚拟主机 VirtualHost 配置完整实战

时间:2026-07-07 10:47:56 编辑:袖梨 来源:一聚教程网

Apache虚拟主机配置需完成加载、授权、路由、验证四步闭环:必须显式包含配置文件、设置DocumentRoot全路径执行权限与Require all granted、通过ServerName/ServerAlias正确路由、HTTP与HTTPS需分端口独立配置并启用mod_ssl。

Apache 虚拟主机配置不是写完 <VirtualHost> 就能跑起来,漏掉任一环节都可能返回 404、403 或始终访问默认站点。关键在“加载、授权、路由、验证”四步闭环。

确保虚拟主机配置被 Apache 实际加载

Apache 不会自动读取 httpd-vhosts.confsites-available 下的文件,必须显式包含。

  • CentOS/RHEL:打开 /etc/httpd/conf/httpd.conf,确认这行已取消注释:
    Include conf/extra/httpd-vhosts.conf
  • Ubuntu/Debian:推荐用 a2ensite 启用站点,例如:
    sudo a2ensite site-a.local.conf,再 sudo systemctl reload apache2
  • 验证是否生效:运行 sudo httpd -M | grep vhost(CentOS)或 sudo apache2ctl -M | grep vhost(Ubuntu),看到 vhost_alias_module 表示模块已启用;再执行 sudo httpd -tsudo apache2ctl -t 确保语法无误

DocumentRoot 目录权限与 Apache 访问控制必须匹配

403 Forbidden 错误中,90% 源于路径权限或缺失 Require 指令。

  • Linux 下 Apache 进程用户通常是 www-data(Ubuntu)或 apache(CentOS),需对 整个路径链 具备执行(x)权限:
    比如 DocumentRoot /var/www/site-a.local/public_html,则 /var/var/www/var/www/site-a.local/var/www/site-a.local/public_html 每一级都得有 x 权限
  • <VirtualHost> 内必须定义 <Directory> 块,并写明访问策略(Apache 2.4+):
    <Directory "/var/www/site-a.local/public_html"><br>  Require all granted<br>  AllowOverride None<br></Directory>
  • 避免用 chmod 777,更安全的做法是:
    sudo chown -R $USER:www-data /var/www/site-a.local
    sudo chmod -R 750 /var/www/site-a.local

基于域名的 VirtualHost 必须靠 ServerName 正确路由

Apache 依据请求头中的 Host 字段顺序匹配 ServerNameServerAlias,第一个完全匹配者胜出。

  • ServerName 必须是完整域名(如 site-a.local),不能带协议、端口或路径
  • ServerAlias 可设多个别名,支持通配符:
    ServerAlias www.site-a.local *.site-a.local(但 *.local 不合法)
  • 多个站点共用一个 IP 和端口时,所有 <VirtualHost *:80>ServerName 必须互不重复;否则后定义的将永远不会被命中
  • 开发测试阶段,可临时修改本地 /etc/hosts 文件模拟 DNS:
    127.0.0.1 site-a.local<br>127.0.0.1 site-b.local

HTTP 与 HTTPS 必须分开定义独立 VirtualHost

HTTP 和 HTTPS 不能混在一个 <VirtualHost> 块里,HTTPS 需监听 443 端口并指定证书路径。

  • 先确保已启用 mod_ssl
    Ubuntu:sudo a2enmod ssl;CentOS:sudo yum install mod_ssl
  • 添加 HTTPS 配置块(与 HTTP 块并列):
    <VirtualHost *:443><br>  ServerName site-a.local<br>  DocumentRoot "/var/www/site-a.local/public_html"<br>  SSLEngine on<br>  SSLCertificateFile /path/to/cert.pem<br>  SSLCertificateKeyFile /path/to/privkey.pem<br>  <Directory "/var/www/site-a.local/public_html"><br>    Require all granted<br>  </Directory><br></VirtualHost>
  • 检查端口监听状态:sudo ss -tlnp | grep ':443',确认 Apache 进程确实在监听

热门栏目