apache 中 虚拟主机 的配置流程

一:怎样理解“虚拟主机”这个名词

虚拟主机是常见的 web 服务(如apache、nginx、tomcat)提供的一种技术,实现在 "单个物理服务器 + 单个web 服务" 上提供多个网站服务。

通过三种方式来区分不同的虚拟主机

  • 基于端口:虚拟主机监听的端口不同,即视为不同站点。

  • 基于 IP 地址:多网卡、多 IP 的服务器上,不同 IP 即为不同站点。

  • 基于域名:若多个虚拟主机监听的端口和 IP 都相同,通过域名(Host 字段)区分。



二:apache 中的两类指令

要了解如何配置虚拟主机,就需要先知道apache 配置文件的格式。apache 的配置文件是由若干指令组成的,这些指令可以分为两大类:

  • 容器类指令:这种指令是放在开始标签 (< >) 和结束标签( </ >) 标签中,用来形成一个作用域。在这个作用域内可以嵌套其他指令,嵌套的指令只在这个作用域内生效。

  • 独立的指令:就是 指令名 参数 这种类型的指令,apache 有个特点就是配置文件中指令的大小写不敏感,如:servernameSERVERNAME 是一样的。

注意:容器类指令也是指令,所以也是可以携带参数和值的,参数或值是放在开始标签中。



三:apache 配置虚拟主机最基础的指令

例如:配置一个监听 80 端口的虚拟主机。

<VirtualHost *:80>
        DocumentRoot /home/ehigh/work/html
        <Directory /home/ehigh/work/html>
                Options FollowSymLinks MultiViews
                AllowOverride All
                Require all granted
        </Directory>

        ErrorLog  /var/log/apache2/error.log
        CustomLog /var/log/apache2/access.log combined
</VirtualHost>


1、VirtualHost 指令

  • VirtualHost 是一个容器类指令,所以需要放在开始和结束标签中(<VirtualHost > <VirtualHost />

  • VirtualHost 指令的参数是一个或多个 IP地址+端口 的组合(host:port), 多个参数之间采用空格分隔,若IP地址为 * 时,表示本机所有网卡都会监听这个地址

例如:监听本机所有网卡的80端口

<VirtualHost *:80>
	# xxx xxx
</VirtualHost>


2、DocumentRoot 指令

DocumentRoot 是用来指定网站的根目录。例如:DocumentRoot /home/ehigh/work/html

什么是网站的根目录?例如:客户端请求:http://10.0.28.10:80/index.html,端口后面的 /,也就是 URL 路径部分最开始的那部分就是网站的根目录。

假设访问:http://10.0.28.10:80/index.html,默认就是去 /home/ehigh/work/html 目录下找 index.html 这个资源文件。



3、Directory 指令:

Directory 是一个容器指令,需要指定一个具体的路径,用来指定如果要访问某个路径下的资源,给什么样的权限。

例如:里面具体的权限配置对 /home/ehigh/work/html 这个目录生效。

<Directory /home/ehigh/work/html>
	# xxx xxx
</Directory>

3.1 Directory 在指定具体的路径后,通过以下独立指令来进行更细致的权限控制

  • Require 指令:决定谁能访问该路径下的资源

  • Options指令:决定给你哪些权限访问该路径下的资源

  • AllowOverride 指令:若 Directory 指定的路径下有一个名为 .htaccess 的配置文件,是否允许 .htaccess 覆盖当前 Directory 中的配置



3.1.1 Require 指令的三个值

  • Require all granted:所有人都能访问这个目录下的内容

  • Require all denied:谁都不能访问这个目录下的内容

  • Require ip 192.168.1.0/24:只允许源地址是这个网段的客户端访问



3.1.2 Options 控制具体的访问方式

  • Indexes:如果访问这个目录下的某个资源文件不存在,就把这个路径下的所有内容都给你列出来。

  • FollowSymLinks:如果访问的资源文件是这个路径下的一个符号链接文件,也可以正常访问到文件内容

  • None:就算你能访问该目录,给你最小的权限访问(就是一些额外的功能用不了,但是基本的静态文件访问能力还在)

  • ALL:给你最高级别的权限访问该目录下的资源(但不包括 ExecCGI,这个功能也不常用),这种最不安全。

  • MultiViews:如果客户端访问的 URL 没有写完整文件名,例如想访问的是: http://10.0.28.7/login.html,但是省略了扩展名,URL就是: http://10.0.28.7/login,此时 Directory 没得这个资源文件。apache 会按照一定的规则自动选择一个最匹配的文件返回。


例如:配置 Options None 会发生啥

  • 首先最基础的静态文件访问能力是有的
  • 如果你访问的资源文件不在,不会给你按照MultiViews自动协商一个出来
  • 如果你访问的资源文件是一个软链接文件,是没法返回这个软链接文件内容;
  • 如果访问的这个资源文件不存在,会返回 403 Forbidden,不会把Directory 所指定路径下的所有文件都列出来的


3.1.3 AllowOverride 指令控制 .htaccess

用于控制当前的配置是否能 Directory 所指定路径下的 .htaccess 中的配置覆盖,有两个值

  • None:假设 Directory 指定的路径下有一个名为 .htaccess 的配置文件,里面的配置不会生效

  • ALL:假设 Directory 指定的路径下有一个名为 .htaccess 的配置文件,里面的配置会覆盖掉容器指令Directory 这个作用域内的配置。


例如:我配置 AllowOverride None,假设存在一个 .htaccess 的配置文件,配置内容是:Options ALL,那么后者就会覆盖前者。

posted on 2025-12-11 20:45  一直小爪子  阅读(7)  评论(0)    收藏  举报