php学习 (第六天)
虚拟主机
一.什么是虚拟主机?
1.1 概念
-
虚拟主机(Web Hosting)
-
英文:Web Hosting / Shared Hosting
-
核心概念: 一台服务器被切分给多个用户,每个人只使用服务器的一部分资源(CPU、内存、带宽、存储),用于部署网站。
-
通俗的讲 虚拟主机就是将计算机中不同文件夹进行不同命名,然后可以实现让服务器(Apache)根据用户的需求从不同文件夹(网站)中读取不同内容
-
个人理解 虚拟主机就是把一台服务器“切开”给很多人用,就好像在一个大房子里隔出很多房间,每个人都有一个属于自己的小空间,可以放网站文件、图片、代码等。服务器软件(例如 Apache、Nginx)会根据访问的 域名 或 端口,去不同的“房间”里找对应的内容返回给用户。
1.2 特点:
- 多个网站共享同一台物理服务器的资源
- 用户权限受限制(通常不能随意安装系统或软件)
- 管理简单,一般只需上传网站文件即可
- 成本低,适合小型网站或个人博客
例子:
- 你买的便宜空间,在 cPanel 里上传 HTML/PHP 文件,别人也在同一台服务器上开空间
适合对象:
- 个人网站、小型公司官网、电商初创网站
1.3 虚拟主机可以分成哪几种类型?
在Apache中,可以将虚拟主机分成两种
1. 基于 IP 的虚拟主机(IP-based Virtual Host)
- 概念
一台服务器可以绑定多个 IP 地址,每个 IP 地址对应一个网站。用户访问某个 IP 时,Apache 会根据这个 IP 来确定应该返回哪个网站的内容。 - 原理
- 一般电脑默认只有一个网卡 → 一个 IP 地址。
- 但服务器通常可以配置多个网卡,或者在同一个网卡上绑定多个 IP。
- Apache 通过监听不同的 IP 地址,将请求分发到对应的网站目录。
- 优点
- 配置直观、兼容性好。
- 早期 SSL(HTTPS)环境下必须使用这种方式(因为当时还没有 SNI 技术)。
- 缺点
- 每个网站需要单独的 IP,资源浪费,成本高。
- 在 IPv4 地址紧缺的情况下,几乎不会大规模使用。
-
示例配置:
<VirtualHost 192.168.1.10:80>ServerName site1.comDocumentRoot "/var/www/site1" </VirtualHost><VirtualHost 192.168.1.11:80>ServerName site2.comDocumentRoot "/var/www/site2" </VirtualHost>
补充:IP地址和IP
IP(internet Protocol) 协议 定义了地址的格式、长度、使用规则(比如 IPv4 是 32 位,IPv6 是 128 位),以及数据包如何在网络中传输。
IP 地址 就是按照这个协议规范生成的一个唯一标识。
所以每个 IP 地址都遵循 IP 协议,才能在网络上被正确识别和路由。
2. 基于域名的虚拟主机(Name-based Virtual Host)
- 一台电脑上一个IP,一个IP下可以制作多个网站,但需要给每个网站不同名字(虚拟主机名)
-
多个网站共享同一个 IP,Apache 通过 域名(Host 头部) 来区分访问的是哪个网站。
-
特点:
- 节省 IP 地址(一个 IP 可以跑很多网站)。
- 现代网站普遍采用这种方式。
- 对 HTTPS(SSL)曾有过限制,但随着 SNI 技术,现在也能支持多域名 SSL。
-
示例配置:
<VirtualHost *:80>ServerName site1.comDocumentRoot "/var/www/site1" </VirtualHost><VirtualHost *:80>ServerName site2.comDocumentRoot "/var/www/site2" </VirtualHost>
二.实操
2.1 Homebrew Apache 配置基于域名虚拟主机的完整示例
前提
- 已经通过 Homebrew 安装 Apache:
brew install httpd
- Apache 配置文件路径:
- Intel 芯片:
/usr/local/etc/httpd/httpd.conf
- M1/M2 芯片:
/opt/homebrew/etc/httpd/httpd.conf
- Intel 芯片:
- 默认 Homebrew Apache 监听 8080 端口(可以改成 80,但需要 sudo)。
1. 修改 hosts 文件(本机域名映射)
sudo nano /etc/hosts
-
sudo
- 全称 “superuser do”
- 让你以 管理员权限(root) 执行后面的命令
- 因为
/etc/hosts
文件是系统文件,普通用户没有权限修改,所以必须加sudo
-
nano
- 一个终端下的 文本编辑器,简单易用
- 用它可以打开文件、编辑内容、保存退出
- 还有其他编辑器可用,比如
vi
、vim
-
/etc/hosts
-
是系统的 本地域名映射文件
-
作用:把域名(例如
site1.local
)映射到 IP(例如127.0.0.1
) -
当你访问一个域名时,系统会先查这个文件,看是否有对应 IP,再去 DNS 查询
-
添加:
127.0.0.1 site1.local
127.0.0.1 site2.local
2. 创建网站目录
mkdir -p ~/Sites/site1
mkdir -p ~/Sites/site2# 添加测试首页
echo "<h1>Site 1</h1>" > ~/Sites/site1/index.html
echo "<h1>Site 2</h1>" > ~/Sites/site2/index.html
指令解释:
-
mkdir
-
全称 “make directory”
-
用来 创建一个新目录(文件夹)
-
-
-p
参数
-
全称 “parents”
-
作用:如果上级目录不存在,会 自动创建上级目录
3.启用虚拟主机功能
编辑 Homebrew Apache 配置文件:
nano /usr/local/etc/httpd/httpd.conf # Intel
# 或者
nano /opt/homebrew/etc/httpd/httpd.conf # M1/M2
- 启用虚拟主机配置
找到:
#Include /usr/local/etc/httpd/extra/httpd-vhosts.conf
去掉 #
:
Include /usr/local/etc/httpd/extra/httpd-vhosts.conf
- 设置主机名解析
确认ServerName
已设置:
ServerName localhost:8080
4. 配置虚拟主机文件
编辑 /usr/local/etc/httpd/extra/httpd-vhosts.conf
(或对应路径):
这里m2 是/opt/homebrew/etc/httpd/extra/httpd-vhosts.conf
默认配置:
配置含义:
1.VirtualHost *:8080> ... </VirtualHost>
- 作用:定义一个虚拟主机块,Apache 监听
*
(所有 IP)和8080
端口的请求。 - 原理:
*
表示可以接收任意网卡的请求,端口必须匹配 Apache 当前监听的端口。
2.ServerAdmin webmaster@site1.local
- 作用:定义网站管理员邮箱。
- 原理:当网站出错(500/404 等)时,Apache 可以在错误页显示这个邮箱,方便用户联系管理员。
- 原理点:这是 元信息,不会影响请求匹配,但便于运维。
3.DocumentRoot "/Users/你的用户名/Sites/site1"
- 作用:虚拟主机的网页根目录。
- 原理:Apache 根据访问的虚拟主机,把 HTTP 请求映射到这个目录下的文件。
- 本质:虚拟主机是目录映射 + 域名匹配的组合。
4.ServerName site1.local
- 作用:定义这个虚拟主机的主域名。
- 原理:Apache 根据 HTTP 请求中的
Host
头部匹配ServerName
,找到对应网站
5.ServerAlias www.site1.local
- 作用:定义别名,可以匹配多个域名。
- 原理:如果用户访问别名,也会指向同一个
DocumentRoot
6.<Directory "/Users/你的用户名/Sites/site1"> ... </Directory>
- 作用:设置目录访问权限和选项。
- 各项原理:
Options Indexes FollowSymLinks
Indexes
:如果目录没有 index.html,允许显示文件列表FollowSymLinks
:允许 Apache 跟随符号链接访问文件
AllowOverride All
- 允许目录下的
.htaccess
文件覆盖配置
- 允许目录下的
Require all granted
- 允许所有用户访问此目录(重要,否则会 403 禁止访问)
7.ErrorLog
和 CustomLog
- ErrorLog:记录错误日志(例如 404、500),便于排查问题
- CustomLog:记录访问日志(谁访问了哪个页面),常用格式
common
- 原理:日志是 Apache 内部模块通过路径写入文件,便于运维和调试。
实操配置如下:
5. 设置目录权限
sudo chown -R $(whoami):_www ~/Sites
chmod -R 755 ~/Sites
Apache 并不强制网站目录必须在 /var/www
,它可以访问任何你配置的 DocumentRoot
目录,只要:
- Apache 进程有权限读取目录和文件
- Homebrew Apache 在 macOS 上通常以
_www
用户运行 _www
用户必须有 读权限(和目录执行权限)才能访问你的 HTML/PHP 文件
- Homebrew Apache 在 macOS 上通常以
- 目录权限和所有权设置正确
- 如果你的网站目录在桌面或
~/Sites
下,默认权限可能是:- 所有者:你自己
- 组:staff
- 权限:700 或 755
- Apache 可能没有权限访问,导致 403 Forbidden
- 如果你的网站目录在桌面或
拆解sudo chown -R $(whoami):_www ~/Sites:
1.sudo
以管理员权限执行命令,因为普通用户可能没有权限修改其他用户或系统目录的所有权。
2.chown
全称 “change owner”
用于修改文件或目录的 所有者(owner)和所属组(group)
3.-R
Recursive(递归)
表示命令会作用于该目录及其所有子目录和文件
4.$(whoami)
代表当前登录用户
用命令替换,将当前用户名填入,例如 user
5.:_www
冒号前是所有者(owner),冒号后是所属组(group)
_www
是 macOS 系统默认的 Web 服务组,Apache 属于这个组
6.~/Sites
指要修改的目录路径
~
代表当前用户主目录
拆解chmod -R 755 ~/Sites:
1.chmod
全称 “change mode”
用于修改文件或目录的 权限
2.-R
递归修改该目录及其所有子文件和子目录
3.755
权限数字表示法:
- 第一个数字 7 → 所有者权限:读®+写(w)+执行(x) = 7
- 第二个数字 5 → 所属组权限:读®+执行(x) = 5
- 第三个数字 5 → 其他用户权限:读®+执行(x) = 5
4.~/Sites
指要修改权限的目录
6.重启 Apache
brew services restart httpd
7. 测试
- 浏览器访问:
http://site1.local:8080 → 显示 Site 1
http://site2.local:8080 → 显示 Site 2
8.注意
如果想用 80 端口,需要修改 httpd.conf
:
Listen 80
并用 sudo brew services restart httpd
启动。
- 如果 Homebrew Apache 和系统自带 Apache 冲突,建议停止系统 Apache:
sudo apachectl stop
- 以后要添加新虚拟主机,只要在
httpd-vhosts.conf
增加一个<VirtualHost>
块即可,并更新/etc/hosts
。