高性能web服务器2——Nginx概述


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 版本支持动态装载和卸载

相关推荐
开心工作室_kaic19 分钟前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
刚刚好ā19 分钟前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
sinat_384241091 小时前
使用 npm 安装 Electron 作为开发依赖
服务器
朝九晚五ฺ1 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
沉默璇年2 小时前
react中useMemo的使用场景
前端·react.js·前端框架
yqcoder2 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
2401_882727572 小时前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架
SoaringHeart2 小时前
Flutter进阶:基于 MLKit 的 OCR 文字识别
前端·flutter
Kkooe2 小时前
GitLab|数据迁移
运维·服务器·git
会发光的猪。2 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js