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

Nginx的核心架构和设计原理

Nginx 是一个免费的、开源的、高性能 Http 服务器和反向代理。Nginx 的架构设计是为了提供高性能、稳定性和可扩展性。

Nginx 的主要架构组件和工作原理:

1、Master 进程:Nginx 的运行始于一个 master 进程,它负责管理所有的工作进程。master 进程负责读取和解析配置文件,并启动工作进程。
2、工作进程:一旦 master 进程启动,它会生成一组工作进程。每个工作进程都是独立运行的,负责处理来自客户端的连接和请求。工作进程之间相互独立,可以并行处理请求,提高了 Nginx 的性能和吞吐量。
3、事件驱动模型:Nginx 采用了事件驱动的模型,主要利用了操作系统提供的异步 I/O 机制。当有新的连接建立或者数据可读写时,Nginx 不会阻塞等待,而是通过事件通知机制处理这些事件,从而提高了处理效率。
4、Nginx 核心模块:Nginx 的核心模块包括 HTTP 模块、事件模块、解析器模块等。HTTP 模块处理 HTTP 请求和响应,包括 HTTP 头部解析、HTTP 请求方法解析、URI 解析等。事件模块负责处理底层的事件通知机制,如 Epoll、Kqueue 等。解析器模块负责解析 Nginx 配置文件。
5、工作流程:当有新的 HTTP 请求到达时,master 进程会将其分发给一个工作进程。工作进程处理请求,根据配置文件进行请求的处理,包括反向代理、负载均衡、静态文件服务等。处理完成后,工作进程将响应返回给客户端。

Nginx 整体架构

在这里插入图片描述
Master 进程
当 Nginx 启动时,它会生成两种类型的进程:主进程(master)和工作进程(worker)。

主进程并不处理网络请求,而是负责调度工作进程,包括加载配置、启动工作进程以及进行非停升级。

因此,当 Nginx 启动后,查看操作系统的进程列表,至少会有两个 Nginx 进程。

工作进程
服务器实际 处理网络请求 及 响应 的是 工作进程(worker),在类 unix 系统上,Nginx 可以配置 多个 worker,而每个 worker 进程 都可以同时处理 数以千计 的 网络请求。

每个工作进程在启动时都会复制主进程的配置信息和相关资源,但它们彼此之间是相互独立的,这意味着它们可以并行地处理请求,互不影响。

此外,每个工作进程还会维护一个事件驱动的事件循环,通过事件驱动机制处理来自客户端的连接请求、数据读取和响应发送,这种异步非阻塞的 I/O 模型确保了 Nginx 的高性能和低资源消耗。

模块化设计
Nginx 的 worker 进程分为核心模块和功能性模块。

核心模块主要负责维持一个运行循环(run-loop),在其中执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。

Nginx 的代码采用了模块化设计,这使得我们可以根据需要选择和修改功能模块,然后编译成具有特定功能的服务器。

事件驱动模型
Nginx 实现了高并发、高性能的关键在于其基于异步及非阻塞的事件驱动模型。

这种模型使得 Nginx 能够高效地处理大量并发请求,而不会因为阻塞等待而降低性能。

此外,Nginx 还充分利用了 Linux、Solaris 以及类 BSD 等操作系统内核中提供的事件通知和 I/O 性能增强功能,如 kqueue、epoll 以及 event ports,进一步提升了其性能表现。

代理设计
Nginx 作为高性能的代理服务器,其代理原理是其设计的核心之一。无论是针对 HTTP 还是其他协议(如 FastCGI、Memcache、Redis 等)的网络请求或响应,Nginx 都采用了代理机制来实现数据的转发和处理。

Nginx 的代理原理主要基于以下几个关键点:
1、接收请求:当 Nginx 接收到客户端的请求时,根据配置文件中的代理设置,确定是否需要进行代理转发。如果需要代理转发,则根据配置选择合适的代理方式。
2、建立连接:Nginx 会与目标服务器建立连接,可以是与远程服务器建立 TCP 连接,也可以是与本地应用程序之间建立的 Unix Socket 连接,取决于代理目标的具体情况。
3、数据传输:一旦连接建立成功,Nginx 会将客户端的请求数据转发给目标服务器,并且在接收到目标服务器的响应后,再将响应数据返回给客户端。这个过程可以是全双工的,意味着 Nginx 可以同时接收客户端请求和目标服务器响应,然后进行相应的转发和处理。
4、代理缓存:为了进一步提高性能,Nginx 还支持代理缓存功能。它可以将经常请求的数据缓存在本地,避免每次请求都要向后端服务器发起请求,从而减少响应时间和网络负载。
5、负载均衡:对于需要代理转发的请求,Nginx 还支持负载均衡功能,可以根据一定的策略将请求分发到多个后端服务器上,以实现负载均衡和高可用性。

相关文章:

  • 大语言模型技术点总结
  • 二、词法分析,《编译原理》(本科教学版),第2版
  • 【C#】内存的使用和释放
  • AWS 管理控制台
  • 打造高质量软件架构 - 9大质量属性
  • [Linux]磁盘分区指令
  • 网络安全全方略
  • Python 爬虫 根据ID获得UP视频信息
  • Linux驱动开发(速记版)--并发与竞争
  • 【HDP】zookeeper未授权漏洞修复
  • debian 12配置固定ip
  • vuepress 浏览器加载缓存,总是显示旧页面,无法自动刷新数据的解决方法
  • JVM常见面试题
  • 足底筋膜炎的症状
  • 2024ICPC网络赛第一场C. Permutation Counting 4(线性代数)
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • C++类中的特殊成员函数
  • CSS居中完全指南——构建CSS居中决策树
  • js学习笔记
  • Python 基础起步 (十) 什么叫函数?
  • python学习笔记 - ThreadLocal
  • 编写符合Python风格的对象
  • 坑!为什么View.startAnimation不起作用?
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 免费小说阅读小程序
  • 前端
  • 如何在GitHub上创建个人博客
  • 用简单代码看卷积组块发展
  • 2017年360最后一道编程题
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #if和#ifdef区别
  • #Java第九次作业--输入输出流和文件操作
  • #Lua:Lua调用C++生成的DLL库
  • (152)时序收敛--->(02)时序收敛二
  • (175)FPGA门控时钟技术
  • (Java数据结构)ArrayList
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (void) (_x == _y)的作用
  • (超详细)语音信号处理之特征提取
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)计算机毕业设计大学生兼职系统
  • (简单) HDU 2612 Find a way,BFS。
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (一)RocketMQ初步认识
  • (一)VirtualBox安装增强功能
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)大型网站架构演变和知识体系
  • (轉)JSON.stringify 语法实例讲解
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .cfg\.dat\.mak(持续补充)
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net core 外观者设计模式 实现,多种支付选择