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://www.pswp.cn/news/923636.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/923636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AcousticsML声学机器学习翻译教程二(特征提取Feature Etraction)

源自&#xff1a;https://github.com/RAMshades/AcousticsM 特征提取 特征是可测量的属性&#xff0c;作为系统的输入。这些输入与特定数据样本相关&#xff0c;机器学习模型可通过解读这些特征来提供预测。特征通常具有独立性&#xff0c;并能提供样本的具体细节。音频特征示例…

【论文阅读】Beyond Text: Frozen Large Language Models in Visual Signal Comprehension

本论文研究了能否利用一个“冻结”的LLM&#xff0c;直接理解视觉信号&#xff08;即图片&#xff09;&#xff0c;而不用在多模态数据集上进行微调。核心思想是把图片看作一种“语言实体”&#xff0c;把图片转换成一组离散词汇&#xff0c;这些词汇来自LLM自己的词表。为此&a…

The Oxford-IIIT宠物图像识别数据集(753M)

0、引言博主研究生期间做的是人工智能领域相关的深度学习模型研究&#xff0c;早期还没定题的时候调研了大量方向。众所周知&#xff0c;模型性能的好坏很大程度上依赖于数据集&#xff0c;因此我当时也接触了大量数据集&#xff0c;这阵子将这些数据集汇总整理了一下&#xff…

jdbc DAO封装及BaseDAO工具类

DAO概念 DAO&#xff1a;Data Access Object&#xff0c;数据访问对象。 Java是面向对象语言&#xff0c;数据在Java中通常以对象的形式存在。一张表对应一个实体类&#xff0c;一张表的操作对应一个DAO对象&#xff01; 在Java操作数据库时&#xff0c;我们会将对同一张表的增…

大模型应用开发2-SpringAI实战

SpringAI整合了大多数大模型&#xff0c;而且对于大模型开发的三种技术架构都有比较好的封装和支持&#xff0c;开发起来非常方便。不同的模型能够接收的输入类型、输出类型不一定相同。SpringAI根据模型的输入和输出类型不同对模型进行了分类&#xff1a; 大模型应用开发大多…

TDengine 时序函数 DIFF 用户手册

DIFF 函数用户手册 函数概述 DIFF 函数用于计算数据列中相邻两行数据的差值&#xff0c;通常用于分析数据的变化趋势和增量。该函数特别适用于监控智能电表数据的变化模式。 语法 SELECT DIFF(column_name [, ignore_negative]) FROM table_name;参数说明 column_name: 数…

清除gradle缓存的某个依赖

要清除 Gradle 缓存中的某个特定依赖&#xff0c;可以按照以下步骤操作&#xff1a;找到依赖在缓存中的路径 Gradle 缓存的默认位置&#xff1a; Windows: C:\Users\<用户名>\.gradle\caches\modules-2\files-2.1 macOS/Linux: ~/.gradle/caches/modules-2/files-2.1 路径…

机器人控制器开发(驱动层——伺服驱动canopen的sdo和pdo)

文章总览 一、核心区别&#xff1a;一句话概括 • ​​SDO&#xff08;服务数据对象&#xff09;​​&#xff1a;像 ​​“问询/设置”​​。用于​​点对点、非周期​​的参数配置和读取。例如&#xff0c;设置电机增益、读取当前位置等。​​速度慢&#xff0c;但确保数据准…

返利APP排行榜数据实时更新:基于 WebSocket 与 Redis 的高并发数据推送技术

返利APP排行榜数据实时更新&#xff1a;基于 WebSocket 与 Redis 的高并发数据推送技术 大家好&#xff0c;我是阿可&#xff0c;微赚淘客系统及省赚客APP创始人&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在返利APP运营中&#xff0c;用户对排…

[论文阅读] 人工智能 + 软件工程 | 告别冗余HTML与高算力消耗:EfficientUICoder如何破解UI2Code的token难题

告别冗余HTML与高算力消耗&#xff1a;EfficientUICoder如何破解UI2Code的token难题 论文信息信息类别具体内容论文原标题EfficientUICoder: A Dual-Modal Token Compression Framework for UI-to-Code Generation with Multimodal Large Language Models论文链接https://arxiv…

【STM32项目开源】STM32单片机智能语音风扇控制系统

目录 一、设计背景和意义 1.1设计背景&#xff1a; 1.2设计意义&#xff1a; 二、实物展示 三、硬件功能介绍 2.1 硬件清单&#xff1a; 2.2 功能介绍&#xff1a; 四、软件设计流程图 五、硬件PCB展示 六、软件主函序展示 七、单片机实物资料 资料获取 查看主页介…

git clone vllm

这个错误不是 vLLM 本身的问题&#xff0c;而是 pip 在 clone GitHub 仓库时失败了&#xff1a; error: RPC failed; curl 16 Error in the HTTP2 framing layer fatal: expected flush after ref listing根因通常是&#xff1a; 网络问题&#xff08;访问 GitHub 被中断 / 代理…

光谱相机的新兴领域应用

光谱相机在‌新兴领域‌的应用正快速拓展&#xff0c;结合‌AI、纳米技术、量子传感‌等前沿科技&#xff0c;突破传统检测极限。以下是六大最具潜力的新兴应用方向及技术突破点&#xff1a;‌1. 元宇宙与数字孪生‌‌应用场景‌&#xff1a;‌虚拟材质建模‌&#xff1a;通过高…

深入理解数据结构之复杂度

文章目录1.数据结构前言1.1 数据结构1.2 算法2.算法效率2.1 复杂度的概念2.2 复杂度的重要性3.1 大O的渐进表式法3.2 时间复杂度计算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例53.2.6 示例63.2.7 示例74.空间复杂度4.1 空间复杂度计算示例4.1.1 示例14.1.2 示…

【Vue3】10-编写vue项目时,ref的应用(2)

合集篇&#xff1a; 1.【Vue3】创建并运行一个简易的Vue3项目 2.【Vue3】编写vue实现一个简单效果&#xff0c;并使用setup糖简化代码 目录refref 定义对象类型的响应式数据1. 概念理解a. 概念b. 分析2. 代码实操代码场景步骤一&#xff1a;导入ref步骤二&#xff1a;修改数据形…

clickhouse 中SUM(CASE WHEN ...) 返回什么类型?

文章目录clickhouse 中SUM(CASE WHEN ...) 返回什么类型&#xff1f;CASE WHENSUM(CASE WHEN ...) 返回什么类型&#xff1f;clickhouse 中SUM(CASE WHEN …) 返回什么类型&#xff1f; CASE WHEN ClickHouse中的CASE WHEN用法与SQL标准中的用法基本相同&#xff0c;用于实现…

【算法】C语言多组输入输出模板

在 C语言 里&#xff0c;“多组输入输出”是很多在线评测系统&#xff08;OJ&#xff09;常见的模式&#xff0c;通常有两种情况&#xff1a;1. 输入到文件结束&#xff08;EOF&#xff09;比如题目没有告诉有多少组数据&#xff0c;就需要一直读直到输入结束。#include <st…

【Ubuntu】sudo apt update出现E :仓库***没有Release文件

【Ubuntu】sudo apt update出现E &#xff1a;仓库***没有Release文件 1 问题描述 在执行sudo apt update更新一下软件包时出现了如下报错 E: 仓库***没有Release 文件。 N: 无法安全地用该源进行更新&#xff0c;所以默认禁用该源。 N:参见apt-secure&#xff08;8&#xf…

全球后量子迁移进展:区域特色与产业落地差异

一、量子威胁具象化&#xff1a;从技术风险到产业冲击量子计算对传统密码体系的威胁已从理论走向现实&#xff0c;其破坏性不仅体现在算法破解效率的飞跃&#xff0c;更渗透到数据全生命周期的安全防护中。以金融领域为例&#xff0c;2024 年国际安全机构模拟实验显示&#xff…

贪心算法应用:决策树(ID3/C4.5)详解

Java中的贪心算法应用&#xff1a;决策树&#xff08;ID3/C4.5&#xff09;详解 决策树是一种常用的机器学习算法&#xff0c;它通过递归地将数据集分割成更小的子集来构建树形结构。ID3和C4.5是两种经典的决策树算法&#xff0c;它们都使用了贪心算法来选择最优的特征进行分割…