一个设计良好的软件,他的架构必然是高效和优秀的,这对性能和维护都很重要。

Nginx的进程结构

nginx image filter 缓存 nginx缓存模块_Nginx

  1. 主进程执行特权操作,如读取配置和绑定端口,还负责创建子进程(下面的三种类型)。
  2. 缓存加载进程(cache loader process)在启动时运行,把基于磁盘的缓存(disk-based cache)加载到内存中,然后退出。对它的调度很谨慎,所以其资源需求很低。
  3. 缓存管理进程(cache manager process)周期性运行,并削减磁盘缓存(prunes entries from the disk caches),以使其保持在配置范围内。
  4. 工作进程(worker processes)才是执行所有实际任务的进程:处理网络连接、读取和写入内容到磁盘,与上游服务器通信等。
Nginx的模块组成

nginx image filter 缓存 nginx缓存模块_Nginx_02

1. 核心模块
核心模块是 Nginx 服务器正常运行 必不可少 的模块,提供 错误日志记录 、 配置文件解析 、 事件驱动机制 、 进程管理 等核心功能。

2. 标准HTTP模块
标准 HTTP 模块提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等。

3. 可选HTTP模块
可选 HTTP 模块主要用于 扩展 标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等。

4. 邮件服务模块
邮件服务模块主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持。

5. 第三方模块
第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等。

Nginx的目录结构

nginx image filter 缓存 nginx缓存模块_nginx_03

├── auto 自动检测系统环境以及编译相关的脚本
│ ├── cc 关于编译器相关的编译选项的检测脚本
│ ├── lib nginx编译所需要的一些库的检测脚本
│ ├── os 与平台相关的一些系统参数与系统调用相关的检测
│ └── types 与数据类型相关的一些辅助脚本
├── conf 存放默认配置文件,在make install后,会拷贝到安装目录中去
├── contrib 存放一些实用工具,如geo配置生成工具(geo2nginx.pl)
├── html 存放默认的网页文件,在make install后,会拷贝到安装目录中去
├── man nginx的man手册
└── src 存放nginx的源代码
├── core nginx的核心源代码,包括常用数据结构的定义,以及nginx初始化运行的核心代码如main函数
├── event 对系统事件处理机制的封装,以及定时器的实现相关代码
│ └── modules 不同事件处理方式的模块化,如select、poll、epoll、kqueue等
├── http nginx作为http服务器相关的代码
│ └── modules 包含http的各种功能模块
├── mail nginx作为邮件代理服务器相关的代码
├── misc 一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持
└── os 主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用


Nginx有优美的协议处理状态机

nginx image filter 缓存 nginx缓存模块_nginx_04

nginx image filter 缓存 nginx缓存模块_nginx_05

Nginx的信号状态管理

nginx image filter 缓存 nginx缓存模块_HTTP_06

此外Nginx之所以高并发的原因也是不得不谈一谈Epoll的。这是linux内核版本2.6之后支持的技术。使用事件触发来复用IO实现高效和高并发。

Nginx吸收了经典的epoll反应堆模型

nginx image filter 缓存 nginx缓存模块_Nginx_07

其实大多数时候Nginx都是被当作代理服务器,是天生的代理服务器,在做为反向代理的时候,扩展业务是更美好的事情了。

Reference:

[1] geektime-nginx/Nginx核心知识100讲-第二部分课件.pdf
[2] http://www.aosabook.org/en/nginx.html