Nginx 概述
Nginx 是一款广泛使用的高性能 Web 和反向代理服务器,以其出色的并发处理能力和低内存消耗而闻名。自 2004 年首次发布以来,Nginx 已经成为许多企业和组织的首选 Web 服务器和负载均衡解决方案。本文将对 Nginx 进行一个全面的概述,包括其特点、用途和架构。
1. Nginx 的特点
1.1 高性能
- 事件驱动架构:Nginx 采用了事件驱动的架构,能够处理大量的并发连接。
- 非阻塞 I/O:通过非阻塞 I/O 模型,Nginx 能够高效地处理 I/O 操作,即使在高并发环境下也能保持良好的性能。
1.2 低资源消耗
- 内存占用少:Nginx 的内存占用非常低,适合部署在资源受限的环境中。
- CPU 使用率低:Nginx 的设计旨在减少 CPU 的使用,从而节省服务器资源。
1.3 稳定性
- 长期稳定运行:Nginx 能够长时间稳定运行,很少出现崩溃或内存泄露的情况。
- 热更新能力:支持热更新配置文件,无需重启即可更新配置。
1.4 模块化设计
- 可扩展性强:Nginx 支持大量的模块,可以根据需要添加不同的功能。
- 定制化配置:通过配置文件可以灵活地定制 Nginx 的行为。
1.5 安全性
- 安全特性:支持 SSL/TLS 加密、IP 黑白名单等安全特性。
- DDoS 防御:内置 DDoS 防御机制,可以有效地抵御攻击。
1.6 高可用性
- 负载均衡:作为反向代理服务器,Nginx 可以实现负载均衡,将请求分发到不同的后端服务器。
- 故障转移:支持健康检查和故障转移机制,确保服务的连续性。
2. Nginx 的用途
2.1 Web 服务器
- 静态文件服务:Nginx 通常用于服务静态文件,如 HTML、CSS 和 JavaScript 文件。
- 动态内容服务:通过与后端应用服务器(如 PHP-FPM 或 Node.js)集成,Nginx 也可以服务动态内容。
2.2 反向代理
- 负载均衡:Nginx 作为反向代理可以将请求分发到多个后端服务器,实现负载均衡。
- 缓存:Nginx 支持缓存机制,可以缓存静态文件和动态内容,提高响应速度。
2.3 API 网关
- API 路由:Nginx 可以作为 API 网关,根据请求路径将请求路由到正确的后端服务。
- 限流与认证:支持限流和认证机制,保护后端服务的安全。
2.4 SSL 终止
- SSL/TLS 卸载:Nginx 可以作为 SSL 终结点,处理 SSL/TLS 加密,减轻后端服务器的负担。
3. Nginx 的架构
3.1 主进程
- 配置加载:主进程负责加载配置文件。
- 管理子进程:主进程管理着多个工作子进程,并负责监控这些子进程的健康状况。
- 对外接口:接收外部的操作(信号)
- 对内转发:根据外部的操作的不同,通过信号管理 Worker
- 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
- 读取Nginx 配置文件并验证其有效性和正确性
- 建立、绑定和关闭socket连接
- 按照配置生成、管理和结束工作进程
- 接受外界指令,比如重启、升级及退出服务器等指令
- 不中断服务,实现平滑升级,重启服务并应用新的配置
- 开启日志文件,获取文件描述符
- 不中断服务,实现平滑升级,升级失败进行回滚处理
- 编译和处理perl脚本
3.2 工作进程
- 事件处理器:每个工作进程都有自己的事件处理器,用于处理连接和 I/O 操作。
- 请求处理:工作进程负责处理客户端请求,包括解析请求、处理请求逻辑、生成响应等。
- 所有 Worker 进程都是平等的
- 实际处理:网络请求,由 Worker 进程处理
- Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争
CPU资源, - 增加上下文切换的损耗
- 接受处理客户的请求
- 将请求依次送入各个功能模块进行处理
- I/O调用,获取响应数据
- 与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求 - 接收主程序指令,比如重启、升级和退出等
nginx进程间通信
工作进程是由主进程生成的,主进程使用fork()函数,在Nginx服务器启动过程中主进程根据配置文件决
定启动工作进程的数量,然后建立一张全局的工作表用于存放当前未退出的所有的工作进程,主进程生
成工作进程后会将新生成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进
程,该管道与普通的管道不同,它是由主进程指向工作进程的单向通道,包含了主进程向工作进程发出
的指令、工作进程ID、工作进程在工作进程表中的索引和必要的文件描述符等信息。
主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送
正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就
会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互。
worker进程之间的通信原理基本上和主进程与worker进程之间的通信是一样的,只要worker进程之间能够
取得彼此的信息,建立管道即可通信,但是由于worker进程之间是完全隔离的,因此一个进程想要知道另外一
个进程的状态信息,就只能通过主进程来实现。
为了实现worker进程之间的交互,master进程在生成worker进程之后,在worker进程表中进行遍历,将该
新进程的PID以及针对该进程建立的管道句柄传递给worker进程中的其他进程,为worker进程之间的通信做
准备,当worker进程1向worker进程2发送指令的时候,首先在master进程给它的其他worker进程工作信息
中找到2的进程PID,然后将正确的指令写入指向进程2的管道,worker进程2捕获到管道中的事件后,解析指
令并进行相关操作,这样就完成了worker进程之间的通信。
另worker进程可以通过共享内存来通讯的,比如upstream中的zone,或者limit_req、limit_conn中的
zone等。操作系统提供了共享内存机制
Nginx启动与HTTP连接建立
HTTP处理过程
Nginx的模块介绍
nginx 有多种模块
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件
驱动机制 、进程管理等核心功能
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应
头设置 等等
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash
多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的
支持
Stream服务模块: 实现反向代理功能,包括TCP协议代理
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支
持等
nginx高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载