1.Nginx概述
Nginx是一个高性能的反向代理和Web服务器软件,因其系统资源消耗低、运行稳定且具有高性能的并发处理能力等特性,在互联网企业中得到广泛的应用。
2.Nginx特性
1.访问路由
现今大型网站的请求量早已不是单一Web服务器可以支撑的了。单一入口、访问请求被分配到不同的业务功能服务器集群,是目前大型网站的通用应用架构。Nginx可以通过访问路径、URL关键字、客户端IP、灰度分流等多种手段实现访问路由的分配。
2.反向代理
就反向代理功能而言,Nginx本身并不产生响应数据,只是应用自身的异步非阻塞事件驱动架构,高效、稳定地将请求反向代理给后端的目标应用服务器,并把响应数据返回给客户端。其不仅可以代理HTTP协议,还可以支持HTTPS、HTTP/2、FastCGI、uWSGI、SCGI、gRPC及TCP/UDP等目前大部分协议的反向代理。
3.负载均衡
Nginx在反向代理的基础上集合自身的上游(upstream)模块支持多种负载均衡算法,使后端服务器可以非常方便的进行横向扩展,从而有效提升应用的处理能力,使整体应用架构可以轻松应对高并发的应用场景。
4.内容缓存
动态处理与静态内容分离是应用架构优化的主要手段之一,Nginx的内容缓存技术不仅可以实现预制静态文件的高速缓存,还可以对应用响应的动态结果实现缓存,为响应结果变化不大的应用提供高速的响应能力。
5.可编程
Nginx模块化的代码架构方式为其提供了高度可定 制的特性,但可以用C语言开发Nginx模块以满足自身 使用需求的用户只是少数。Nginx在开发之初就具备了 使用Perl脚本语言实现功能增强的能力。Nginx对JavaScript语言及第三方模块对Lua语言的支持,使得其可编程能力更强。
3.Nginx源码架构浅析
Nginx低资源消耗、高稳定、高性能的并发处理能力,来源于其优秀的代码架构。它采用了多进程模型,使自身具有低资源消耗的特性。以事件驱动的异步非阻塞多进程请求处理模型,使Nginx的工作进程通过异步非阻塞的事件处理机制,实现了高性能的并发处理能力,让每个连接的请求均可在Nginx进程中以工作流的方式得到快速处理。Nginx代码架构充分利用操作系统的各种机制,发挥了软硬件的最大性能,使它在普通硬件上也可以处理数十万个并发连接。
Nginx支持在多种操作系统下部署运行,为发挥Nginx的最大性能,需要对不同的平台进行细微的调整。
3.1 多进程模型
进程是操作系统资源分配的最小单位,由于CPU数量有限,多个进程间通过被分配的时间片来获得CPU的使用权,系统在进行内核管理和进程调度的时候,要执行保存当前进程上下文、更新控制信息、选择另一就绪进程、恢复就绪进程上下文等一系列操作,而频繁切换进程会造成资源消耗。
Nginx采用的是固定数量的多进程模型,如下图:
由一个主进程(Master Process)和数量与主机CPU核数相同的工作进程协调处理各种事件。主管理进程负责工作进程的配置加载、启停等操作,工作进程负责处理具体请求。进程间的资源都是独立的,每个工作进程处理多个连接,每个连接由一个工作进程全权处理,不需要进行进程切换,也就不会产生由进程切换引起的资源消耗问题。默认配置下,工作进程的数量与主机CPU核数相同,充分利用CPU和进程的亲缘性(affinity)将工作进程与CPU绑定,从而最大限度地发挥多核CPU的处理能力。
3.2 工作流机制
Nginx在处理客户端请求的时候,每个连接仅由一个进程进行处理,每个请求仅运行在一个工作流中,工作流被划分为多个阶段,如下图:
请求在不同阶段由功能模块进行数据处理,处理结果异常或结束则将结果返回客户端,否则将进入下一阶段。工作流程维护工作流的执行,并通过工作流的状态推动工作流完成请求操作的闭环。下图为异步非阻塞机制流程图:
3.3 模块化
Nginx一直秉持模块化的理念,其模块化的架构中,除了少量的主流程代码,都是模块。模块化的设 计为Nginx提供了高度的可配置、可扩展、可定制特性。模块代码包括核心模块和功能模块两个部分:核 心模块负责维护进程的运行、内存及事件的管理;功 能模块则负责具体功能应用的实现,包括路由分配、 内容过滤、网络及磁盘数据读写、代理转发、负载均衡等操作。Nginx的高度抽象接口使用户很容易根据开 发规范进行模块开发,有很多非常实用的第三方模块被广泛使用。模块大致分为以下几类:
·核心模块(core):该模块提供了Nginx服务运 行的基本功能,如Nginx的进程管理、CPU亲缘性、内存管理、配置文件解析、日志等功能。
事件模块(event):该模块负责进行连接处理,提供对不同操作系统的I/O网络模型支持和自动根 据系统平台选择最有效I/O网络模型的方法。
HTTP模块(http):该模块提供HTTP处理的核 心功能和部分功能模块,HTTP核心功能维护了HTTP多 个阶段的工作流,并实现了对各种HTTP功能模块的管 理和调用。
·Mail模块(mail):该模块实现邮件代理功 能,代理IMAP、POP3、SMTP协议。
·Stream模块(stream):该模块提供TCP/UDP会 话的代理和负载相关功能
第三方模块:第三方模块即非Nginx官方开发的 功能模块,据统计,在开源社区发布的第三方模块已经达到100多个,其中lua-resty、nginx-module-vts 等模块的使用度非常高。