当前位置: 首页 > news >正文

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

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • STM32 —— TIM(基本定时器)详解_stm32的tim
  • 实验十 编写子程序《汇编语言》- 王爽
  • 设计者模式:深度解析及应用
  • DC-DC 转换器中的压电谐振器:当前状态和限制
  • Ps:首选项 - 性能
  • RabbitMQ集群 - 普通集群搭建、宕机情况
  • 控制阶段在DMAIC中的主要目标是什么?
  • python 速成指南
  • vba发邮件的几种方法:新人如何快速上手?
  • OpenCV几何图像变换(1)映射转换函数convertMaps()的使用
  • 前端算法 | LeetCode第 70 题爬楼梯问题
  • 骑行耳机品牌前五名排行榜:5大优质骑行耳机闭眼入都不踩雷!
  • 哈佛大学年中回顾2024年ESG发展近况
  • 导出word格式的Javadoc(可用于快速生成项目详细设计文档)
  • Swoole 和 Java 哪个更有优势呢
  • Akka系列(七):Actor持久化之Akka persistence
  • Apache的80端口被占用以及访问时报错403
  • DataBase in Android
  • eclipse的离线汉化
  • Java读取Properties文件的六种方法
  • MySQL几个简单SQL的优化
  • node.js
  • ubuntu 下nginx安装 并支持https协议
  • ucore操作系统实验笔记 - 重新理解中断
  • Wamp集成环境 添加PHP的新版本
  • 阿里云Kubernetes容器服务上体验Knative
  • 彻底搞懂浏览器Event-loop
  • 大型网站性能监测、分析与优化常见问题QA
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 怎么把视频里的音乐提取出来
  • 正则学习笔记
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 正则表达式-基础知识Review
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • # 数据结构
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (35)远程识别(又称无人机识别)(二)
  • (9)目标检测_SSD的原理
  • (C++20) consteval立即函数
  • (C语言)球球大作战
  • (Note)C++中的继承方式
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • ... 是什么 ?... 有什么用处?
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务