当前位置: 首页 > news >正文

Apache 虚拟主机配置指南:从单站点到多站点

一、什么是虚拟主机

虚拟主机(Virtual Host)是 Apache 的核心功能之一,允许在一台物理服务器上托管多个网站。每个网站拥有独立的域名、文档根目录和配置,互不干扰。

Apache 支持三种虚拟主机方式:

类型区分依据适用场景
基于域名(Name-based)HTTP 请求头中的Host字段最常用,共享同一个 IP 地址
基于 IP(IP-based)不同的 IP 地址需要独立 IP 的场景
基于端口(Port-based)不同的端口号内部测试、特殊应用

本文重点介绍基于域名的虚拟主机,这是目前最主流、最实用的方案。

二、核心原理:基于域名的虚拟主机

2.1 工作原理

Apache 通过 HTTP 请求头中的Host字段来区分不同的网站。当浏览器访问http://set.charitize.dsz时,会在请求头中携带Host: set.charitize.dsz,Apache 根据这个字段匹配对应的<VirtualHost>块。

隐藏子域名 /var/www/set默认站点 /var/www/localhost/htdocsApache 服务器DNS 解析浏览器隐藏子域名 /var/www/set默认站点 /var/www/localhost/htdocsApache 服务器DNS 解析浏览器查询 set.charitize.dsz返回服务器 IPGET / HTTP/1.1Host: set.charitize.dsz匹配 ServerName返回 /var/www/set 内容index.html200 OK + 页面内容GET / HTTP/1.1Host: localhost未精确匹配走第一个 VirtualHost(默认)index.html200 OK + 页面内容

2.2 与单站点的核心区别

方面初始配置(单站点)修改后配置(虚拟主机)
站点数量只有 1 个站点(全局DocumentRoot多个虚拟主机(默认 + 隐藏子域名)
匹配方式所有请求都去同一个目录根据Host请求头分发到不同目录
配置结构全局DocumentRoot+Directory多个<VirtualHost>
关键指令DocumentRoot "/var/www/localhost/htdocs"NameVirtualHost *:80+<VirtualHost *:80>

三、配置步骤详解

3.1 启用虚拟主机功能

在 Apache 2.2 中,需要显式启用NameVirtualHost指令:

NameVirtualHost *:80

作用:告诉 Apache 启用基于域名的虚拟主机功能,监听所有 IP 的 80 端口。如果没有这个指令,Apache 会将所有请求交给第一个VirtualHost处理。

在 Apache 2.4 中,NameVirtualHost已被废弃,默认自动启用基于域名的虚拟主机。

3.2 配置默认虚拟主机

当使用虚拟主机时,全局的DocumentRoot会被忽略,必须将站点配置放在VirtualHost块中。

<VirtualHost *:80> ServerName localhost ServerAlias default DocumentRoot "/var/www/localhost/htdocs" <Directory "/var/www/localhost/htdocs"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/localhost_error.log CustomLog ${APACHE_LOG_DIR}/localhost_access.log combined </VirtualHost>

作用

  • 处理访问localhost的请求
  • 作为默认站点,处理所有未匹配到的域名请求(包括直接 IP 访问、未知域名)

3.3 配置隐藏子域名虚拟主机

<VirtualHost *:80> ServerName set.charitize.dsz DocumentRoot "/var/www/set" <Directory "/var/www/set"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/set_error.log CustomLog ${APACHE_LOG_DIR}/set_access.log combined </VirtualHost>

作用:只处理Host: set.charitize.dsz的请求,访问其他域名不会看到这个站点。

3.4 完整配置示例

# 启用基于域名的虚拟主机(Apache 2.2 需要) NameVirtualHost *:80 # 默认虚拟主机(必须放在第一位,作为 fallback) <VirtualHost *:80> ServerName localhost ServerAlias default DocumentRoot "/var/www/localhost/htdocs" <Directory "/var/www/localhost/htdocs"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/localhost_error.log CustomLog ${APACHE_LOG_DIR}/localhost_access.log combined </VirtualHost> # 隐藏子域名虚拟主机 <VirtualHost *:80> ServerName set.charitize.dsz DocumentRoot "/var/www/set" <Directory "/var/www/set"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/set_error.log CustomLog ${APACHE_LOG_DIR}/set_access.log combined </VirtualHost>

四、请求处理流程

HTTP 请求

Host: set.charitize.dsz

Host: localhost / IP

Host: 其他未知域名

浏览器/客户端

Apache Web 服务器

隐藏子域名站点
DocumentRoot: /var/www/set

默认站点
DocumentRoot: /var/www/localhost/htdocs

匹配规则

  1. Apache 收到请求后,读取 HTTP 头中的Host字段
  2. 精确匹配ServerName→ 返回对应站点内容
  3. 未精确匹配 → 走第一个VirtualHost(默认站点)

五、常见问题与解决

5.1 为什么配置了 VirtualHost 后原来的站点无法访问?

原因:配置VirtualHost后,Apache 进入"虚拟主机模式"。在这个模式下:

  1. 全局的DocumentRoot被忽略
  2. 只有VirtualHost块中定义的站点才能被访问
  3. 如果没有定义处理原来域名(如localhost或直接 IP 访问)的VirtualHost,原来的内容就无法访问

解决:添加一个默认VirtualHost,将原来的配置移入其中。

5.2 如何验证虚拟主机配置?

# 列出所有虚拟主机sudoapachectl-S

输出示例:

VirtualHost configuration: *:80 localhost (/etc/apache2/httpd.conf:162) *:80 set.charitize.dsz (/etc/apache2/httpd.conf:175)

5.3 如何添加更多站点?

只需增加新的<VirtualHost *:80>块,指定不同的ServerNameDocumentRoot

<VirtualHost *:80> ServerName blog.example.com DocumentRoot "/var/www/blog" ... </VirtualHost>

5.4 403 Forbidden 错误?

可能原因:

  • 目录权限不正确:sudo chmod -R 755 /var/www
  • 配置中缺少Require all granted
  • SELinux 未关闭(CentOS):sudo setenforce 0

六、关键指令速查表

指令作用
NameVirtualHost *:80启用基于域名的虚拟主机(Apache 2.2)
<VirtualHost *:80>定义一个虚拟主机块
ServerName设置虚拟主机的主域名
ServerAlias设置虚拟主机的别名域名
DocumentRoot设置站点的文档根目录
ErrorLog设置错误日志路径
CustomLog设置访问日志路径

七、总结

问题答案
为什么要加默认虚拟主机?让原来直接访问 IP/localhost 的用户还能看到原来的网站
为什么隐藏子域名生效?Apache 根据Host请求头精确匹配ServerName
访问顺序是什么?精确匹配ServerName→ 匹配不到的走第一个VirtualHost(默认站点)
如何添加更多隐藏站点?增加新的<VirtualHost *:80>块,指定不同的ServerNameDocumentRoot

虚拟主机是 Apache 最实用的功能之一,通过基于域名的方式,可以在一台服务器上高效托管多个独立站点,既节省资源又便于管理。

http://www.jsqmd.com/news/987952/

相关文章:

  • 3个秘诀让Continue成为你的终极AI代码审查搭档:如何实现源码可控的智能检查
  • OpenAI最强编程助手Codex:下载安装、使用指南(含使用方式、提示技巧、趋势)
  • RollToolsApi架构深度解析:构建稳定聚合API接口源的技术实践
  • 2026年6月最新版东营第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • 青岛红色合伙人防水是什么?楼长修楼官方合作资质全解析 - 青岛防水品牌推荐
  • sublime-phpcs与版本控制集成:提交代码前自动检查的实现方法
  • Polyglot-Ko-1.3B应用场景探索:客服机器人、内容创作与教育辅助
  • TanStack Ranger:打造现代化滑块组件的终极无头UI解决方案
  • 深度实战:用MarkItDown构建你的文档转换流水线
  • CAD如何修改快捷键?CAD如何自定义快捷键。
  • 2026年6月最新版固原第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • 2026年6月最新版大庆第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • 5个Claudian插件使用技巧:快速提升AI交互效率的完整指南
  • PVC 橡胶阻燃剂应用分类解析 优质生产厂家甄选指南 - 变量人生001
  • 从3D Tiles到I3S:使用loaders.gl实现不同瓦片格式的转换
  • ChatMLX核心功能全解析:多模型支持、隐私保护与39种语言能力
  • Progenitor客户端高级配置:自定义请求头、超时和认证的实用技巧
  • 批量改图片DPI的Python脚本
  • 2026深圳拆装搬家服务专业服务商推荐:家具/空调/热水器专业拆移搬迁一站式服务 - 从来都是英雄出少年
  • 3个核心场景:从零开始配置yuzu Switch模拟器,让电脑流畅运行任天堂游戏
  • Comparative-analysis-of-hourly-load-forecasting-using-PatchTST-TFT-NHiTS-and-CatBoost源代码详解:核心组件与实现原理
  • 2026年6月最新版大同第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • 高效跨平台阅读体验:Awaken EPUB阅读器的四大核心优势与实战指南
  • 人生第一双高跟鞋品牌排行:轻奢舒适兼具纪念意义 - 起跑123
  • 扎根青岛24年!本土老牌防水楼长修楼真实测评 - 青岛防水品牌推荐
  • 青岛海边小区漏水频发?盐雾气候对防水层的致命影响 - 青岛防水品牌推荐
  • 3步掌握LLPlayer:从零开始的语言学习终极指南
  • Baserow企业级无代码平台:生产环境架构解析与高性能部署指南
  • 邮件配置与测试:awesome-checker-services邮件相关检查工具完全手册
  • cann/asc-devkit SinCosCompute性能调优样例