一句话总结:Nginx的多进程+单线程事件驱动模型,配合可选的线程池处理阻塞操作,是其高性能的秘诀。
一、Nginx架构总览:多进程与单线程的完美结合
1.1 核心架构设计
首先,让我们明确一点:Nginx默认采用多进程架构,每个工作进程内部是单线程的。
当Nginx启动时,它会创建一个主进程(Master Process)和多个工作进程(Worker Processes)。这种设计既保证了系统的稳定性,又充分发挥了多核CPU的性能。
# 查看Nginx进程
$ ps -ef | grep nginx
root [主进程PID] 1 0 10:00 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx [工作进程PID] [主进程PID] 0 10:00 ? 00:00:12 nginx: worker process
nginx [工作进程PID] [主进程PID] 0 10:00 ? 00:00:10 nginx: worker process
nginx [工作进程PID] [主进程PID] 0 10:00 ? 00:00:11 nginx: worker process
1.2 进程职责分工
主进程(Master Process):以root权限运行,像是整个Nginx帝国的"总管",负责:
- 读取配置文件并验证有效性
- 启动、停止和维护工作进程
- 接收管理员命令(如重启、重载配置)
- 监听工作进程状态,异常时自动重启
工作进程(Worker Processes):以普通用户身份运行,像是前线处理请求的"工人",负责:
- 实际处理客户端的网络请求
- 执行反向代理、负载均衡等功能
- 每个进程独立运行,互不干扰
二、Worker进程的奥秘:单线程为何如此高效
2.1 事件驱动模型:单线程的威力之源
每个Worker进程内部是单线程的,但它们却能同时处理成千上万的并发连接,这得益于事件驱动模型和非阻塞I/O。
想象一个高效的快递员(Worker进程),他不需要为每个包裹(请求)单独跑一趟,而是有一个智能通知系统(epoll):当有包裹到达时,系统会通知他,他依次处理。这样,一个快递员就能处理大量包裹。
# Nginx事件模型配置示例
events {
worker_connections 10240; # 每个worker进程最大连接数
use epoll; # 使用Linux的epoll模型
multi_accept on; # 一次接受多个连接
}
2.2 核心技术:I/O多路复用
在Linux系统中,Nginx使用epoll实现I/O多路复用;而在BSD系统上,则使用kqueue。
与传统I/O模型相比,epoll的优势在于:
- O(1)时间复杂度:只返回就绪的连接,不需要扫描所有连接
- 边缘触发(ET)或水平触发(LT):灵活控制事件通知方式
- 支持海量并发:轻松管理数万并发连接
// 简化的epoll工作流程
int epfd = epoll_cr

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



