Nginx 核心架构设计和原则
Nginx 核心架构设计和原理
Chaya:「码哥元宵节快乐,在我散落的流年里,有你陪伴,我也不曾孤单」。 码哥:“祝大家元宵节快乐,升职加薪。”
Nginx 是一个免费的、开源的、高性能 Http 服务器和反向代理。Nginx 的架构设计是为了提供高性能、稳定性和可扩展性。
以下是 Nginx 的主要架构组件和工作原理:
-
Master 进程:
- Nginx 的运行始于一个 master 进程,它负责管理所有的工作进程。
- master 进程负责读取和解析配置文件,并启动工作进程。
-
工作进程:
- 一旦 master 进程启动,它会生成一组工作进程。
- 每个工作进程都是独立运行的,负责处理来自客户端的连接和请求。
- 工作进程之间相互独立,可以并行处理请求,提高了 Nginx 的性能和吞吐量。
-
事件驱动模型:
- Nginx 采用了事件驱动的模型,主要利用了操作系统提供的异步 I/O 机制。
- 当有新的连接建立或者数据可读写时,Nginx 不会阻塞等待,而是通过事件通知机制处理这些事件,从而提高了处理效率。
-
Nginx 核心模块:
- Nginx 的核心模块包括 HTTP 模块、事件模块、解析器模块等。
- HTTP 模块处理 HTTP 请求和响应,包括 HTTP 头部解析、HTTP 请求方法解析、URI 解析等。
- 事件模块负责处理底层的事件通知机制,如 Epoll、Kqueue 等。
- 解析器模块负责解析 Nginx 配置文件。
-
工作流程:
- 当有新的 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 的代理原理主要基于以下几个关键点:
- 接收请求:当 Nginx 接收到客户端的请求时,根据配置文件中的代理设置,确定是否需要进行代理转发。如果需要代理转发,则根据配置选择合适的代理方式。
- 建立连接:Nginx 会与目标服务器建立连接,可以是与远程服务器建立 TCP 连接,也可以是与本地应用程序之间建立的 Unix Socket 连接,取决于代理目标的具体情况。
- 数据传输:一旦连接建立成功,Nginx 会将客户端的请求数据转发给目标服务器,并且在接收到目标服务器的响应后,再将响应数据返回给客户端。这个过程可以是全双工的,意味着 Nginx 可以同时接收客户端请求和目标服务器响应,然后进行相应的转发和处理。
- 代理缓存:为了进一步提高性能,Nginx 还支持代理缓存功能。它可以将经常请求的数据缓存在本地,避免每次请求都要向后端服务器发起请求,从而减少响应时间和网络负载。
- 负载均衡:对于需要代理转发的请求,Nginx 还支持负载均衡功能,可以根据一定的策略将请求分发到多个后端服务器上,以实现负载均衡和高可用性。
推荐阅读
-
系统架构设计师]需要掌握的 200 个术语和缩略语
-
XLI.多云/混合云架构设计(网络和基础设施管理)
-
周末必学!一步一步教你怎么搭建LNMP架构和部署系统,跟着Nginx系列教程走~
-
实操Nginx的LNMP、LNNMP和LNNNMP架构,以及缓存技术的应用
-
实战 LNAMP 架构:Linux、Nginx、Apache、MySQL 和 PHP 高性能配置指南
-
全面解析:AI芯片的架构、类别与核心技术——CPU、GPU、FPGA和ASIC的详细介绍(转摘合集)
-
搞定!23种设计模式和七大设计原则的完美梳理(第一部分)
-
深入探索jQuery内部机制:揭秘Sizzle选择器的架构设计和实现原理
-
构建三层交换与VTP、STP及Eth-Trunk融合实验:基于双核架构实现高效、稳定、冗余网络" 实验目标: 利用双核心结构,整合三层交换技术、VTP (Virtual Trunking Protocol)、生成树协议 (STP) 和以太网通道 (Eth-Trunk),达成网络高速切换、高可用性、高可靠性和备份连接,适用于双核心拓扑场景。 实验步骤: 1. VLAN划分与IP地址规划: - VLAN10:192.168.10.0/24,默认网关192.168.10.1 - VLAN20:192.168.20.0/24,默认网关192.168.20.1 - VLAN30:192.168.30.0/24,默认网关192.168.30.1 - VLAN40:192.168.40.0/24,默认网关192.168.40.1 2. MSW1三层交换机配置: - 开启三层路由功能:`MSW1(config)#ip routing` - 配置Trunk接口:`MSW1(config-if-range)#switchport trunk encapsulation dot1q; switchport mode trunk` - 设置VTP域和模式:`MSW1(config)#vtp domain test; vtp mode server; vtp password cisco; vtp version 2` - 创建并命名VLAN:`MSW1(config)#vlan 10; MSW1(config-vlan)#name caiwu; ... (为其他VLAN重复操作)` - 分配VLAN IP地址:`MSW1(config-if)#int vlan 10; ip address 192.168.10.1 255.255.255.0; no shutdown; ... (为其他VLAN重复操作)` - 配置生成树优先级:`MSW1(config)#spanning-tree vlan 10,20 root primary; MSW1(config)#spanning-tree vlan 30,40 root secondary` - 链接Eth-Trunk通道:`MSW1(config-if-range)#channel-group 1 mode on; ... (为其他相关接口重复操作)` 3. MSW2三层交换机配置类似MSW1,只需更改VLAN名称和IP地址以及相关端口配置即可。 通过以上步骤,两台三层交换机之间可通过Eth-Trunk实现高速数据交互,并通过VTP统一管理VLAN资源,STP则确保了网络流量的负载均衡,从而构建了一个高效、稳定且具备冗余保护的网络环境。
-
在Spring Boot构建的微服务架构中,我们如何利用Spring Security和JWT来设计一个权限认证解决方案?