造轮子工程 · 第 7 章 造 Web 服务器


文档摘要

造轮子工程 · 第 7 章 造 Web 服务器 章节摘要:Web 服务器是后端工程师的必修造轮子课——因为「会造 HTTP 服务器」意味着你真正理解了 HTTP 协议、socket 网络、并发模型这三件后端的核心。本章导读一个 Web 服务器的五个核心子系统:socket 编程(TCP 监听与连接)、HTTP 协议解析(请求行、头、体;响应状态码)、请求路由(按方法与路径分派到处理函数)、静态文件服务(把磁盘文件映射成响应)、并发模型(每连接一线程、线程池、事件循环三种取舍)。我们以「造一个能响应 GET、提供静态文件、并发处理多连接的小服务器」为目标,呼应《Linux 命令》第 7 章的 ——你的服务器要能被 正确访问。

造轮子工程 · 第 7 章 造 Web 服务器

章节摘要:Web 服务器是后端工程师的必修造轮子课——因为「会造 HTTP 服务器」意味着你真正理解了 HTTP 协议、socket 网络、并发模型这三件后端的核心。本章导读一个 Web 服务器的五个核心子系统:socket 编程(TCP 监听与连接)、HTTP 协议解析(请求行、头、体;响应状态码)、请求路由(按方法与路径分派到处理函数)、静态文件服务(把磁盘文件映射成响应)、并发模型(每连接一线程、线程池、事件循环三种取舍)。我们以「造一个能响应 GET、提供静态文件、并发处理多连接的小服务器」为目标,呼应《Linux 命令》第 7 章的 curl——你的服务器要能被 curl 正确访问。读完本章,你不仅拥有自己的 Web 服务器,更理解了 Nginx、Express、Flask 这类成熟框架在「帮你做什么」以及「为什么这样帮你」。

学习目标

阅读完本章,你应当能够:

  1. 用 socket API 实现 TCP 监听:bind(绑定端口)、listen(开始监听)、accept(接受连接)、recv/send(收发数据)。
  2. 解析 HTTP 请求:请求行(方法 + 路径 + 版本)、请求头(键值对,直到空行)、请求体(按 Content-Length 读)。
  3. 构造 HTTP 响应:状态行(版本 + 状态码 + 原因短语)、响应头、响应体,理解 200/301/404/500 等常见状态码。
  4. 实现请求路由:按「方法 + 路径」分派到不同的处理函数,支持路径参数(如 /users/:id)。
  5. 实现静态文件服务:把 URL 路径映射到磁盘文件、按扩展名设 Content-Type、处理 404 与目录遍历安全。
  6. 说清三种并发模型:每连接一线程(简单、连接多时开销大)、线程池(复用线程、有上限)、事件循环/IO 多路复用(单线程高并发,如 Nginx)。
  7. curl -v 测试你的服务器,验证握手、请求、响应的每个细节(呼应《Linux 命令》第 7 章)。

核心概念速览

Web 服务器的本质是一个「accept 循环 + HTTP 解析 + 路由分派 + 响应构造」的流水线,难点不在某一步,而在「并发模型」——如何在成千上万的连接面前既不耗尽资源、又不让某个慢连接拖垮整体。这是 Nginx 选事件循环、传统 Apache 选线程池的根本原因。

子章节导航

01 socket 编程:TCP 监听与连接

HTTP 跑在 TCP 上,所以要先会用 socket。讲清服务端四步:socket(建 fd)、bind(绑端口)、listen(开始监听)、accept(接受一个连接,返回新 fd)。呼应《Linux 命令》第 6 章(文件描述符)与第 7 章(ss 看监听端口)。

02 HTTP 请求解析

HTTP 请求是纯文本:请求行(GET /path HTTP/1.1)、若干头(Host: ...,空行结束)、可选体。讲清按行解析、Content-Length 决定体长、chunked 编码的进阶。呼应《Linux 命令》第 7 章(curl 的请求格式)。

03 HTTP 响应构造

响应也是纯文本:状态行(HTTP/1.1 200 OK)、响应头、响应体。讲清常见状态码(200/301/302/304/400/404/500)、Content-Length/Content-Type 等关键头。你的服务器要能让 curl -v 正确打印响应。

04 请求路由

把「方法 + 路径」映射到处理函数。讲清静态路由(/api/users)与动态路由(/api/users/:id)的实现思路,以及「找不到匹配返回 404」的兜底。这一步让你的服务器从「只会返回固定内容」升级为「真正的应用后端」。

05 静态文件服务

把 URL 路径映射到磁盘文件。讲清 Content-Type 按扩展名判定(.html/.css/.png)、目录默认找 index.html、以及安全红线——必须防范路径穿越(呼应《Linux 命令》第 2 章的相对路径与第 4 章的 find)。

06 并发模型:三种取舍

Web 服务器的真正难点。三种模型:每连接一线程(简单,连接多时线程开销大)、线程池(复用线程,可控上限)、事件循环/IO 多路复用(单线程高并发,Nginx 的选择)。讲清各自的适用场景与典型代表。

07 综合:一个并发静态文件服务器

把前六节串起来,目标是造一个:能监听端口、并发处理多连接、提供静态文件、返回 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 服务器框架的演进路径——从「能响应」到「能高并发响应」。

前置知识与后续延伸

前置知识:

  • 姊妹篇《Linux 命令实战》第 6 章(进程、文件描述符——socket 就是一种 fd)
  • 姊妹篇《Linux 命令实战》第 7 章(网络、curlss——你要先会用工具测服务器)
  • 第 2 章(造 Shell——fork/exec 在并发模型里再次出现)

本章为后续章节奠定的基础:

  • socket 编程与并发模型,是任何网络服务的基础——延伸到 RPC、消息队列、游戏服务器
  • HTTP 协议的理解,延伸到 HTTPS/TLS、HTTP/2、WebSocket
  • 「accept 循环 + 事件循环」的模式,与第 8 章(数据库)的网络接入层相通
  • 造完 Web 服务器,你理解了「框架在帮你做什么」——Express/Flask/Spring 不再是黑箱,而是「socket + HTTP 解析 + 路由 + 中间件」的封装

发布者: 作者: 灏天文库 转发
评论区 (0)
U