造轮子工程 · 第 7 章 造 Web 服务器 章节摘要:Web 服务器是后端工程师的必修造轮子课——因为「会造 HTTP 服务器」意味着你真正理解了 HTTP 协议、socket 网络、并发模型这三件后端的核心。本章导读一个 Web 服务器的五个核心子系统:socket 编程(TCP 监听与连接)、HTTP 协议解析(请求行、头、体;响应状态码)、请求路由(按方法与路径分派到处理函数)、静态文件服务(把磁盘文件映射成响应)、并发模型(每连接一线程、线程池、事件循环三种取舍)。我们以「造一个能响应 GET、提供静态文件、并发处理多连接的小服务器」为目标,呼应《Linux 命令》第 7 章的 ——你的服务器要能被 正确访问。
章节摘要:Web 服务器是后端工程师的必修造轮子课——因为「会造 HTTP 服务器」意味着你真正理解了 HTTP 协议、socket 网络、并发模型这三件后端的核心。本章导读一个 Web 服务器的五个核心子系统:socket 编程(TCP 监听与连接)、HTTP 协议解析(请求行、头、体;响应状态码)、请求路由(按方法与路径分派到处理函数)、静态文件服务(把磁盘文件映射成响应)、并发模型(每连接一线程、线程池、事件循环三种取舍)。我们以「造一个能响应 GET、提供静态文件、并发处理多连接的小服务器」为目标,呼应《Linux 命令》第 7 章的
curl——你的服务器要能被curl正确访问。读完本章,你不仅拥有自己的 Web 服务器,更理解了 Nginx、Express、Flask 这类成熟框架在「帮你做什么」以及「为什么这样帮你」。
阅读完本章,你应当能够:
bind(绑定端口)、listen(开始监听)、accept(接受连接)、recv/send(收发数据)。/users/:id)。curl -v 测试你的服务器,验证握手、请求、响应的每个细节(呼应《Linux 命令》第 7 章)。Web 服务器的本质是一个「accept 循环 + HTTP 解析 + 路由分派 + 响应构造」的流水线,难点不在某一步,而在「并发模型」——如何在成千上万的连接面前既不耗尽资源、又不让某个慢连接拖垮整体。这是 Nginx 选事件循环、传统 Apache 选线程池的根本原因。
HTTP 跑在 TCP 上,所以要先会用 socket。讲清服务端四步:socket(建 fd)、bind(绑端口)、listen(开始监听)、accept(接受一个连接,返回新 fd)。呼应《Linux 命令》第 6 章(文件描述符)与第 7 章(ss 看监听端口)。
HTTP 请求是纯文本:请求行(GET /path HTTP/1.1)、若干头(Host: ...,空行结束)、可选体。讲清按行解析、Content-Length 决定体长、chunked 编码的进阶。呼应《Linux 命令》第 7 章(curl 的请求格式)。
响应也是纯文本:状态行(HTTP/1.1 200 OK)、响应头、响应体。讲清常见状态码(200/301/302/304/400/404/500)、Content-Length/Content-Type 等关键头。你的服务器要能让 curl -v 正确打印响应。
把「方法 + 路径」映射到处理函数。讲清静态路由(/api/users)与动态路由(/api/users/:id)的实现思路,以及「找不到匹配返回 404」的兜底。这一步让你的服务器从「只会返回固定内容」升级为「真正的应用后端」。
把 URL 路径映射到磁盘文件。讲清 Content-Type 按扩展名判定(.html/.css/.png)、目录默认找 index.html、以及安全红线——必须防范路径穿越(呼应《Linux 命令》第 2 章的相对路径与第 4 章的 find)。
Web 服务器的真正难点。三种模型:每连接一线程(简单,连接多时线程开销大)、线程池(复用线程,可控上限)、事件循环/IO 多路复用(单线程高并发,Nginx 的选择)。讲清各自的适用场景与典型代表。
把前六节串起来,目标是造一个:能监听端口、并发处理多连接、提供静态文件、返回 404 的小服务器。用它来托管一个静态网站,并用 curl -v 与浏览器双重验证。这是本章的最小可用目标。
本章遵循「网络 → 协议 → 路由 → 文件 → 并发 → 综合」的递进路径,从「能收发字节」到「能并发服务」:
socket (01) ── TCP 层: 收发字节 │ ▼ 请求解析 (02) ── HTTP 层: 解析请求 │ ▼ 响应构造 (03) ── HTTP 层: 构造响应 │ ▼ 路由 (04) ── 应用层: 分派到处理函数 │ ▼ 静态文件 (05) ── 应用层: 磁盘文件映射 │ ▼ 并发模型 (06) ── 工程层: 多连接处理 │ ▼ 综合服务器 (07) ── 全章综合应用 │ ▼ 第 8 章:从"无状态服务"到"持久化存储"——造数据库
01 是网络地基(socket 是一切网络程序的起点);02-03 是 HTTP 协议层;04-05 是应用层(让服务器有实际功能);06 是工程层(并发是生产级服务器的真正挑战);07 是综合。这条路线也是真实 Web 服务器框架的演进路径——从「能响应」到「能高并发响应」。
前置知识:
curl、ss——你要先会用工具测服务器)本章为后续章节奠定的基础: