Web 服务架构概览
Apache 的三种工作模式
Apache 作为老牌 Web 服务器,其演进过程反映了并发处理能力的提升。
Prefork 模式(预派生)
这是最经典的模式。主进程派生出多个独立的子进程,每个子进程单线程响应请求。它使用 select 模型,最大并发数通常限制在 1024。虽然内存占用较高,但稳定性极佳,故障隔离性好。适合访问量中等的场景,但在高并发下资源消耗过大。
Worker 模式(多进程 + 多线程)
为了解决 Prefork 的资源问题,Worker 引入了多线程。主进程启动多个子进程,每个子进程包含固定数量的线程。线程不足时新建子进程补充。相比 Prefork,内存占用更低,支持更高并发。不过长连接(keepalive)会长期占用线程,高并发下可能出现无可用线程的情况。
Event 模式(事件驱动)
从 2.4.X 版本开始正式支持,基于 epoll 事件驱动。每个进程能响应多个请求,并专门用线程管理 keepalive 连接。它的核心优化在于解决了 keepalive 连接空占线程的问题——有真实请求时才分配服务线程,执行完立即释放。单线程响应多请求,内存占用少,高并发表现优秀,但缺乏线程安全控制。
Nginx 简介
Nginx 由俄罗斯工程师 Igor Sysoev 开发,最初是为 Rambler.ru 搜索引擎设计的。2004 年发布首个稳定版,如今已成为互联网基础设施的核心组件。天猫、淘宝、京东等一线大厂均在使用或二次开发。它支持 HTTP 服务器、反向代理、邮件服务器,1.9 版本以上开启 stream 模块甚至支持 TCP/UDP 负载均衡。核心代码约 19.8 万行,性价比极高。
服务端 I/O 流程解析
基本概念
I/O 即输入输出。IOPS 衡量磁盘性能,指单位时间内系统处理的 I/O 请求数。完整的 I/O 过程涉及用户空间进程与内核空间的数据交换。由于内核与用户空间严格隔离,数据必须拷贝才能访问。
服务器 I/O 类型
- 磁盘 I/O:进程向内核发起系统调用,内核通过驱动将文件加载到内核内存,再拷贝到进程内存。大文件加载耗时较长。
- 网络 I/O:本质是对 socket 文件的读写。核心在于网络协议栈与用户空间进程的数据交换。
I/O 通用流程
无论是磁盘还是网络,标准流程都分为两步:
- 数据准备阶段:将数据从文件加载到内核内存缓冲区,耗时较长。
- 数据拷贝阶段:将数据从内核缓冲区拷贝到用户进程内存,耗时较短。
I/O 模型核心概念
同步与异步
这主要关注消息通信机制。
- 同步:被调用者不主动通知结果,需调用者主动查询。
- 异步:被调用者通过状态、通知或回调主动告知运行状态。
阻塞与非阻塞
这关注等待结果时的状态。
- 阻塞:IO 操作完全完成后才返回,调用者挂起,无法执行其他操作。
- 非阻塞:IO 操作调用后立即返回状态值,无需等待完成,调用者不挂起。
网络 I/O 模型详解
阻塞型 I/O (Blocking IO)
用户线程发起 read 系统调用后,内核等待数据包到达并拷贝到用户空间。在此期间,用户线程全程阻塞。优点是程序简单,阻塞期间基本不占用 CPU;缺点是每连接需独立进程/线程,高并发时内存和线程切换开销巨大。Apache Prefork 模式就是典型应用。
非阻塞型 I/O (Nonblocking IO)
用户线程发起请求后立即返回(若无数据)。线程需不断轮询直到数据到达。核心问题是大量文件描述符需逐个轮询,上下文切换频繁,且轮询时间难把控。实际极少单独使用。

