🌐 第四章 Web网站的运行原理
📄 一句话概括

一个 Web 网站不是"一堆网页文件"这么简单,它由四件东西凑成:域名(门牌)、服务器主机(房子)、Web 服务器软件(门房)、内容文件(货)。四件齐了才立得起来;而搭这四件的方式有一整条光谱——从自己买机器装软件写页面(什么都要管)到拖拽式建站平台(什么都不用管),管得越少越贵,这条光谱正好对应 1.8 讲的 IaaS / PaaS / SaaS。

📝 第四章开篇:这一章要回答什么

从今天起,拆的是每天都在发生、却几乎没人说清的那三秒钟:在地址栏敲一个网址,按回车,页面出来了——这中间到底过了几道手?

第三章把通用语言(TCP/IP)讲透了:地址、路由、端口、DNS、DHCP 全会了。可那些都是"怎么把数据送到"。这一章要讲的是"送到了之后,怎么了"——也就是应用程序自己那套规矩:网页是怎么被取回来的、为什么能点链接跳页、为什么能输入密码登录、为什么有的页面快有的慢。

一句话:第三章讲管道,第四章讲管道里流的东西怎么变成你眼前那个页面。

💡 好消息:这一章不用从零开始

打开网页要走的链路,前三步第三章已经讲完了:

步骤 谁在干 出处
把域名换成 IP DNS 解析模块 + DNS 服务器 3.21、3.22
跟服务器建立连接 TCP 三次握手 3.5
数据怎么出门 私有地址 → NAT → 路由器逐跳转发 3.14、3.7
找到那个程序 端口号(80 / 443) 3.17

本章新增的,只有最后一步:数据到了服务器,那个程序拿它干了什么,又是怎么把网页送回来的。

一、先给"Web 网站"下个准确的定义

平时说"网站",脑子里想的是屏幕上那个页面。但那一屏东西是结果,不是网站本身。

❗ Web 网站 = 四件东西的组合
部件 通俗说法 缺了会怎样
域名 网站的门牌(example.com) 得靠一串 IP 访问——没人记得住、也没法换服务器
服务器主机 网站的房子(一台 24h 开机的机器) 关机了页面就打不开
Web 服务器软件 网站的门房(收请求、给文件) 装了机器也没人应答请求
内容文件 网站的货(HTML / CSS / JS / 图片) 服务器应答了,但"箱子里是空的"

(对应上面第一张图)

这里最容易混的是中间两件,我拿生活里的楼做个类比:

房子和门房是两回事。你可以换一栋房子(把网站迁到新服务器)而门房还是原来那套软件;也可以在同一栋房子里让两个门房各管一个站(一台服务器托管多个网站,靠域名区分,这在独立服务器上非常常见)。

那个"门房"到底是谁

Web 服务器软件是这四件里唯一必须"跑起来"的——它整天空转着等,一有人敲门就干三件事:

  1. 守在门口——盯着 80 端口(HTTP) 和 443 端口(HTTPS)(这两个号的出处见 3.17 的已知端口名册)
  2. 看你要什么——收到请求,从中读出"你要哪个文件"(/index.html、/images/logo.png)
  3. 把货递出去——从网站根目录找到文件,打包成响应送回;找不到就回一句 404

实际用哪套,主流就三个名字:

软件 常在哪见到 特点
Apache 老牌网站、本机学习(XAMPP 里就是它) 资格最老、模块最多、配置写起来啰嗦
nginx 现在的主流:大流量站点、反向代理 轻、快、扛并发
IIS Windows Server 环境 微软家、和 Windows 域打通
💡 收 1.7 的账

1.7 说"服务器 = 24 小时待命跑服务程序的电脑"——那个"服务程序",在 Web 场景里就是本节这位门房。

所以"网站服务器"这个词其实是两层意思叠在一起:硬件那一层(房子)+ 软件那一层(门房)。听懂这一点,后面看到"换服务器"(换机器)和"换服务器软件"(换 nginx / Apache)就不会混。

别急:你的电脑也能当服务器

这一点值得先破掉心理门槛——门房不看机器贵不贵,只看有没有程序在开着。

cd 任意一个放了几张网页的文件夹
python -m http.server 8000

然后在浏览器打开 http://localhost:8000——一个真网站就这么跑起来了(这条命令 1.7 的 Demo07 里用过,本节 Demo38 会再走一遍,这次带着"看门房怎么干活"的眼光)。区别只在于:它在你自己电脑上、只有你能访问、关机就没了。

二、网站是怎么被"构建"出来的

知道了四件东西,构建一个网站无非就是把这四件凑齐。凑法有三条路,核心区别是"哪几件由你负责":

路线 你要负责 谁负责其余 典型做法
全自建 四件全管 没人帮你 买 VPS / 独立服务器 → 自己装 nginx → 传文件 → 配域名解析
半托管 只管内容文件(有时加一点配置) 平台管机器和软件 虚拟主机 / 云主机一键镜像 / 托管型建站环境
全托管 什么都不用管,甚至内容都是拖出来的 平台全包 WordPress.com、各类 SaaS 建站平台、电商平台店铺
❗ 这条路线的学名,你 1.8 就学过

1.8 那节把云服务按"你租到服务器的第几层"分成三类。现在把它套到建站上,严丝合缝:

建站路线 你租到了第几层 云服务叫法
租 VPS,自己装系统、装 nginx、传文件 只租到硬件(厨房给你,锅碗自己买) IaaS
只写代码/传页面,运行环境平台给 租到运行环境(半成品披萨) PaaS
用建站平台拖页面,什么都不碰 直接租到应用程序(进店堂食) SaaS

租得越多,你管得越少——但灵活度也越低。 想改点底层配置时会发现平台不给开那个口子,这是全托管的必然代价(1.8 的原话:"鱼与熊掌")。

那"构建"这个词,到底指哪些动作

以全自建这条最硬的路为例,把动作摊开看,其实和 2.5 的网络设计五步是同一个骨架:

步骤 干什么 回收旧账
① 备内容 写好 HTML / 备好图片,放成一棵目录树 —
② 备房子 买或租一台机器,装好操作系统 1.7 内部部署 vs 云服务
③ 装门房 安装 Web 服务器软件,指定"网站根目录"指到哪 本节
④ 挂门牌 注册域名 → 在 DNS 里把域名指向这台机器的 IP 3.21 资源记录 A、3.22
⑤ 开门验客 从手机流量(不走自家 Wi-Fi)打开域名,能显示就算成 3.12 三层递进排障法

第 ⑤ 步那个"用手机流量试"是条实用经验:走自家 Wi-Fi 访问可能被内网路径"抄近道"掩盖问题(收 3.14 NAT 单向性——对外能不能访问,只有从外面试才知道)。

三、网页本体里装的是什么

"内容文件"这箱货,日常就这几类:

文件 干什么 类比
HTML 内容与结构(标题、段落、链接、图片位置) 房子的骨架
CSS 外观(颜色、字号、间距、布局) 装修
JavaScript 行为(点击响应、动态更新、请求数据) 水电煤气(能动能干活)
图片 / 字体 / 视频 素材 家具
📝 静态内容 vs 动态内容
  • 静态:文件本来就存在,门房找到就发。访问 logo.png 一万次,发的都是同一个文件。
  • 动态:文件不存在,是服务器上的程序现场生成的。典型场景:登录后页面顶部显示"欢迎你,波仔"——这行字不在任何文件里,是程序查到你的账号后拼出来的。

动态内容的背后通常还有数据库(一个专门存数据的程序):程序收到请求 → 查数据库 → 拿数据 → 和事先写好的模板拼在一起 → 才变成 HTML 发给你。

动态内容越多的网站(论坛、后台系统、电商),服务器越吃力——因为它每次都得"现场干活",不能像静态文件那样直接扔出去。这也是 1.7 说的"服务器不够就得弹性伸缩"的现实来源。

⚠️ 一个常见困惑:为什么本地双击打开网页,和从服务器打开不一样

双击文件走的是 file://,浏览器直接读硬盘,不经过网络、也不经过任何门房。从服务器打开走的是 http://,中间隔了 DNS、TCP、HTTP 一整条链(本章要讲的就是这条链)。

两个最实际的差别:① 本地能用的某些脚本能力,从 http:// 打开会被浏览器限制(安全策略);② 页面里那些"请求数据"的动作,本地根本没有服务器可问。

四、把这四件串起来:一次访问的完整时间线

(对应上面第二张图)

时刻 谁在做 发生了什么
1 你 地址栏输入 https://example.com/index.html 回车
2 浏览器 把网址拆成三块:协议 https / 域名 example.com / 路径 /index.html
3 解析模块 + DNS 查 IP:本机缓存 → hosts → 依次问 DNS 服务器(3.21、3.22)
4 你的电脑 ↔ 服务器 三次握手建连接(3.5),目标是 443 端口(3.17)
5 路上的设备 数据包出门:查路由表(3.7)→ 问网关 MAC(3.16)→ 经 NAT 换地址(3.14)→ 逐跳接力(1.4)
6 服务器上的门房 收到请求,找到文件,发回响应(状态码 + 内容)
7 浏览器 读到 HTML,发现里面还引用了 CSS、JS、图片 → 再发一长串请求
8 你 页面画出来了
❗ 第 7 步是本节最值得记的一条

打开一个网页,从来不是一次请求。

你只敲了一个网址,浏览器随后为页面里每一个 CSS、每一个脚本、每一张图片、每一个字体各发一次请求——一个普通首页常常是几十到上百次请求。

这就解释了三个日常现象: - 为什么页面是一点点"长出来"的(先文字后图片)——文件到齐的先后不同 - 为什么缓存清掉后第一次打开特别慢(3.21/3.22 讲的冷热查询,在资源层也是一样) - 为什么"图片太多网页就卡"——不是字节量大,而是请求次数多(每次都要建连接、走一遍链路)

这不是"网络慢",是一个页面本来就由几百个小包裹拼成。第一次打开某网站的"卡一下",跟 3.18 讲的 TCP 慢启动、3.21 讲的冷查询,说的是同一件事的不同层。

五、动手 Demo38:把一个网站拆开看

1. 数清一个网页的"包裹数"(最有冲击力的一步) 打开任意一个门户网站,按 F12 → 切到 网络(Network) 面板 → 刷新页面。 看面板左下角的请求数和总传输大小。你会看到一百多条记录——这一百多条,就是刚才讲的那一串请求(这也正是 1.6 的 Demo06"F12 看应用层对话"的放大版)。

2. 看门房说的话(收 3.5 的 curl -v)

curl -I https://www.example.com

-I 只取响应头。重点看三行:状态码(200 正常 / 301·302 跳转 / 404 找不到 / 500 服务器自己出错)、Content-Type(这是个什么文件)、Server(门房是哪个软件——经常能直接看出 nginx 还是 Apache)。

3. 自己当一次门房(收 1.7 的 Demo07)

cd 一个放了几个 .html 的文件夹
python -m http.server 8000

浏览器打开 http://localhost:8000。这次注意看这条命令的窗口——你每刷新一次页面,它就打印一行日志。 那一行日志,就是门房的工作记录:"谁在什么时候要了什么文件、我回答了什么"。真实网站的服务器日志,就是这张表的放大版(1.7 讲的"监控"里最有用的那一项)。

4. 认一遍"网址的五脏六腑"

https://www.example.com:443/path/page.html?q=1#top
└─┬─┘ └──────┬───────┘└┬┘└─────┬─────┘└─┬─┘└┬┘
 协议      域名(=IP)   端口    路径     查询  锚点

5. 30 秒实验:给一个网页做体检 在 F12 网络面板里点一下 "大小"列排序,回答三个问题: ① 一共几个请求?② 有没有一个特别大的文件(通常是图片或视频)?③ 重复刷新一次,哪些请求变成了"缓存命中"(状态 304 或显示 memory / disk cache)? —— 这三问就是前端优化的全部起点。先看清楚,再谈优化。

六、常见误区

  1. ❌ "网站就是一堆网页文件" → 还有域名、服务器主机、Web 服务器软件三件;文件只是其中的"货"(本节第一张图)
  2. ❌ "服务器是一种特殊的机器" → 跑着服务程序的电脑就是服务器(收 1.7);你的笔记本跑 python -m http.server 那一刻也是
  3. ❌ "打开一个网页 = 一次请求" → 一次 HTML 请求后面跟着几十上百次资源请求,页面是拼出来的
  4. ❌ "域名和网站是一回事" → 域名是门牌:可以换门牌、也可以一个门牌挂多个站(一台服务器托管多站)
  5. ❌ "做网站一定得买服务器" → 从自建到建站平台是一整条光谱,对应 IaaS / PaaS / SaaS(收 1.8);租得越多管得越少
  6. ❌ "80 和 443 是随便挑的号" → 它们是 HTTP / HTTPS 的已知端口(收 3.17):服务端守着固定号,客户端才找得到
  7. ❌ "网页上的字是一个一个从服务器传来的" → 服务器发的是文本文件(HTML),排版和绘制是浏览器干的活
  8. ❌ "本地能打开,说明网页没问题" → file:// 和 http:// 是两条完全不同的路,本地能跑不代表上线能跑(反之亦然)

七、动手自测

❓ 自测一下
  1. Web 网站由哪四件东西组成?各用一句大白话说清它是干什么的。
  2. "服务器主机"和"Web 服务器软件"有什么区别?能不能只换其中一个?
  3. 一台机器上跑两个不同的网站,靠什么区分?
  4. Web 服务器软件一整天在干什么?它守的是哪两个端口?
  5. 建站的三条路(自建 / 半托管 / 全托管)分别对应 1.8 的哪一类云服务?
  6. 静态内容和动态内容的本质差别是什么?动态内容背后通常还有什么?
  7. 你敲了一个网址,为什么浏览器发了上百次请求?
  8. 网址里的 #top,服务器能收到吗?为什么?
  9. 从"敲网址"到"看到页面"的八个时刻,哪个环节是本章新讲的?前几个环节分别是第三章的哪几节?
  10. 想让别人访问你家的服务器,为什么建议用手机流量试,而不是用自家 Wi-Fi?

答案: ① 域名(门牌,靠 DNS 换成 IP)、服务器主机(房子,24h 开机的机器)、Web 服务器软件(门房,收请求给文件)、内容文件(货,HTML/CSS/JS/图片)。 ② 前者是硬件(一台机器),后者是软件(nginx / Apache / IIS)。能分别换:搬家换机器而门房不变,或者同机器换一套服务器软件继续服务(也正因此,"网站服务器"这个词有两层意思)。 ③ 靠域名区分:同一个 IP 收到请求,门房从请求头里认出"你要的是哪个域名",再去对应的网站根目录取文件——这正是 1.7 说的"一台服务器能跑多个服务"。 ④ 一直空转着等请求:守着 80(HTTP)/ 443(HTTPS) 端口,收到请求 → 找文件 → 回响应,找不到就 404。 ⑤ 自建 = IaaS(只租到硬件/机器);半托管 = PaaS(租到运行环境);全托管 = SaaS(直接租到应用程序)。规律:租得越多,管得越少,灵活度越低。 ⑥ 静态文件本来就存在于磁盘上,找到就发;动态内容是程序现场生成的。动态背后通常有数据库。 ⑦ 因为页面不是单个文件:HTML 里引用的每个 CSS、JS、图片、字体,浏览器都得各要一次。所以"卡"很多时候是请求次数多,不是字节量大。 ⑧ 收不到。# 后面是锚点,只给浏览器自己用来"跳到页面某一段",从不出现在发给服务器的请求里。(对比第二节的 ?q=1 查询串,那个是要发给服务器的。) ⑨ 新讲的是最后一步(HTTP 请求与应答、门房怎么给货)。前几步:查 IP → 3.21 / 3.22;建连接 → 3.5;出门与转发 → 3.7 / 3.14 / 3.16;端口定位 → 3.17。 ⑩ 因为走自家 Wi-Fi 访问可能被内网路径"抄近道"掩盖问题(内网直达,不经过 NAT 出墙那一趟)。对外可不可达,只有从外面试才作数(收 3.14 NAT 单向性)。

八、下一步学什么

相关笔记