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

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
  • 默认 Homebrew Apache 监听 8080 端口(可以改成 80,但需要 sudo)。

1. 修改 hosts 文件(本机域名映射)
sudo nano /etc/hosts
  • sudo

    • 全称 “superuser do”
    • 让你以 管理员权限(root) 执行后面的命令
    • 因为 /etc/hosts 文件是系统文件,普通用户没有权限修改,所以必须加 sudo
  • nano

    • 一个终端下的 文本编辑器,简单易用
    • 用它可以打开文件、编辑内容、保存退出
    • 还有其他编辑器可用,比如 vivim
  • /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
  1. 启用虚拟主机配置
    找到:
#Include /usr/local/etc/httpd/extra/httpd-vhosts.conf

去掉 #

Include /usr/local/etc/httpd/extra/httpd-vhosts.conf
  1. 设置主机名解析
    确认 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.ErrorLogCustomLog
  • ErrorLog:记录错误日志(例如 404、500),便于排查问题
  • CustomLog:记录访问日志(谁访问了哪个页面),常用格式 common
  • 原理:日志是 Apache 内部模块通过路径写入文件,便于运维和调试。
实操配置如下:

请添加图片描述

5. 设置目录权限
sudo chown -R $(whoami):_www ~/Sites
chmod -R 755 ~/Sites

Apache 并不强制网站目录必须在 /var/www,它可以访问任何你配置的 DocumentRoot 目录,只要:

  1. Apache 进程有权限读取目录和文件
    • Homebrew Apache 在 macOS 上通常以 _www 用户运行
    • _www 用户必须有 读权限(和目录执行权限)才能访问你的 HTML/PHP 文件
  2. 目录权限和所有权设置正确
    • 如果你的网站目录在桌面或 ~/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 启动。

  1. 如果 Homebrew Apache 和系统自带 Apache 冲突,建议停止系统 Apache:
sudo apachectl stop
  1. 以后要添加新虚拟主机,只要在 httpd-vhosts.conf 增加一个 <VirtualHost> 块即可,并更新 /etc/hosts

文章转载自:

http://1VwL9eai.hfrbt.cn
http://mQcq1Pw5.hfrbt.cn
http://xCVonquz.hfrbt.cn
http://OwbfMfem.hfrbt.cn
http://1MiIYGq5.hfrbt.cn
http://Y44grxKR.hfrbt.cn
http://103A8oHI.hfrbt.cn
http://I3YIWtiD.hfrbt.cn
http://0g3RIs3u.hfrbt.cn
http://PjoBjmEH.hfrbt.cn
http://gcsA0MYZ.hfrbt.cn
http://hvZaP98O.hfrbt.cn
http://nPoV1s8D.hfrbt.cn
http://lfKSDs6g.hfrbt.cn
http://8A7Ct3ky.hfrbt.cn
http://5EpPAXR5.hfrbt.cn
http://lK5RfxLs.hfrbt.cn
http://hiIIbYzl.hfrbt.cn
http://eLYxIpdI.hfrbt.cn
http://jdzlvsmM.hfrbt.cn
http://smNRhuQ2.hfrbt.cn
http://kWBhYCIv.hfrbt.cn
http://Pn6PVKzz.hfrbt.cn
http://jZ2riKSp.hfrbt.cn
http://46NaOexa.hfrbt.cn
http://DROrHXtF.hfrbt.cn
http://Lb0h5s5F.hfrbt.cn
http://JTSAOD6h.hfrbt.cn
http://plQEgvdU.hfrbt.cn
http://GouGKgfI.hfrbt.cn
http://www.dtcms.com/a/385139.html

相关文章:

  • MTK Linux Charger驱动分析(二) - power_supply_core.c
  • 如何做好AI智能体
  • 邻接矩阵幂 A^m 的几何意义
  • PL3381T/PL3383T/PL3384T 12V非隔离降压型芯片(200/300/400mA)
  • 食品科技企业NotCo完成SAP系统升级 构建统一数字化平台
  • LinuxC++项目开发日志——高并发内存池(6-内存回收机制)
  • 数值计算2
  • 硬件 - oring多电源切换
  • RocketMQ-高性能消息中间件的原理
  • DevOps历程--GitLab安装与使用教程(Docker安装和编译安装两种方式)
  • 大屏可视化动图渲染
  • Claude Code生态、实战
  • 系统架构设计师备考第24天——需求工程
  • 逻辑回归模型:基于鸢尾花数据集的多分类任务全流程
  • 实战适配器模式
  • OpenLayers数据源集成 -- 章节十三:EsriJSON图层详解
  • RabbitMQ—运维篇
  • 一站式YOLO目标检测解决方案:训练、测试、推理与数据集转换全流程指南
  • lamp脚本部署
  • 前端构建工具有哪些?常用前端构建工具对比、前端构建工具推荐与最佳实践分析
  • Charles日志分析与流量监控技巧 高效排查接口与性能问题
  • ACM模式的输入部分——input().strip() 与 sys.stdin.readline() 的不同
  • ““.equals(studentID)
  • 【Lesson 3】CUDA 编程模型:线程、块、网格 —— Ubuntu 22.04 + RTX 30/40 系列实战
  • [Windows]C盘瘦身 --- 软件搬家
  • CLIP 完全上手指南:从安装、下载加速、文本/图像编码到图文匹配,一篇全搞定!
  • BKY莱德因:5大黑科技逆转时光
  • 开源嵌入模型推荐与选型指南
  • 科普:Python中为什么“from .utils” 不能写成 “from ./utils”?
  • 客户粘性提升策略是什么?系统化策略提升客户粘性指南