nginx模块化架构以高性能为核心目标,通过低耦合、非阻塞、按需加载实现轻量确定性;模块经回调钩子接入事件循环,不创建线程或调用阻塞系统调用;工作进程在epoll/kqueue中非阻塞处理请求;模块仅注册指令与钩子,运行时按配置动态初始化;主进程与工作进程职责分离,模块通过标准api交互,避免锁竞争;配置指令驱动模块调度,声明式执行路径提升可预测性与运行效率。

Nginx 的模块化架构不是为“看起来灵活”而设计的,而是直接服务于高性能目标——模块之间低耦合、不阻塞、按需加载,让核心始终保持轻量和确定性。
模块与事件循环零干扰
每个 HTTP 模块(如 ngx_http_rewrite_module 或 ngx_http_proxy_module)都通过预定义的回调钩子(如 postconfiguration、handler)接入主流程,不自行创建线程,也不调用阻塞式系统调用。工作进程在 epoll/kqueue 事件循环中依次调用各模块的 handler,整个请求处理始终处于非阻塞状态。比如 rewrite 指令解析完成后立即返回,不会等待正则匹配结果阻塞后续连接处理。
模块加载不拖慢启动与运行
- 模块代码在编译期静态链接或运行时动态加载,但仅注册指令表和钩子函数,不分配运行时资源
- 配置解析阶段才真正初始化模块上下文(如 ngx_http_core_main_conf_t),未启用的模块完全不参与请求生命周期
- 像 ngx_http_upstream_module 这类重量级模块,只在遇到 proxy_pass 等指令时才激活对应 upstream 流程,空闲时不消耗 CPU 或内存
核心与模块职责严格隔离
主进程只负责读配置、fork 工作进程、信号转发;所有网络 I/O、协议解析、内容生成均由工作进程内的模块协作完成。模块不能修改核心数据结构(如 ngx_connection_t 的关键字段),只能通过标准 API(如 ngx_http_send_header()、ngx_chain_add_copy())交互。这种隔离避免了锁竞争,也使得单个工作进程可稳定支撑上万并发连接。
配置即模块调度策略
模块行为由配置指令驱动,而非硬编码逻辑。例如:limit_req 指令触发限流模块介入请求阶段;add_header 指令让头部过滤模块在输出阶段插入字段;try_files 则交由文件模块按顺序检查路径。这种声明式调度让模块执行路径清晰、可预测,便于 Nginx 在编译期优化状态机跳转,减少运行时分支判断开销。











