Nginx基本原理和架构
Nginx 介绍和架构设计
Nginx介绍
Nginx最初的设计是成为一个Http服务器,一个能够解决C10K问题的服务器,即一个能够处理10000连接的Http服务器。Nginx通过基于事件的处理机制解决C10K问题。
Nginx架构
nginx 基本组件包含Master 和Worker
1. 主进程
Nginx 启动时,会生成两种类型的 进程,一个 **主进程(master)**, 多个工作进程(worker)。master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。我们要控制nginx,只需要通过kill向master进程发送信号就行了。
* kill -HUP pid
则是告诉nginx,从容地重启nginx,我们一般用这个信号来重启nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。master进程在接收到HUP信号后是怎么做的呢?首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了。新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。当然,直接给master进程发送信号,这是比较老的操作方式,
* ./nginx-s reload
重启nginx
* ./nginx -s stop
停止nginx的运行。如何做到的呢?我们还是拿reload来说,我们看到,执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号,然后接下来的动作,就和我们直接向master进程发送信号一样了。
2. 工作进程
服务器实际 处理网络请求 及 响应 的是 工作进程(worker),在类 unix 系统上,Nginx 可以配置 多个 worker,而每个 worker 进程 都可以同时处理 数以千计 的 网络请求。
3. 模块化设计
Nginx 的 worker 进程,包括 核心 和 功能性模块,核心模块 负责维持一个 运行循环(run-loop),执行网络请求处理的 不同阶段 的模块功能,比如:网络读写、存储读写、内容传输、外出过滤,以及 将请求发往上游服务器 等。而其代码的 模块化设计,也使得我们可以根据需要对 功能模块 进行适当的 选择 和 修改,编译成具有 特定功能 的服务器。
* Handlers(处理器模块)
此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
* Filters (过滤器模块)
此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
* Proxies (代理类模块)
此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。
4. 事件驱动模型
基于 异步及非阻塞 的 事件驱动模型,可以说是 Nginx 得以获得 高并发、高性能 的关键因素,同时也得益于对 Linux、Solaris 及类 BSD 等操作系统内核中 事件通知 及 I/O 性能增强功能 的采用,如 kqueue、epoll 及 event ports。
5. 代理(proxy)设计
代理设计,可以说是 Nginx 深入骨髓的设计,无论是对于 HTTP,还是对于 FastCGI、Memcache、Redis 等的网络请求或响应,本质上都采用了 代理机制。所以,Nginx 天生就是高性能的 代理服务器。
Nginx 请求处理过程
)