实战java高并发程序设计-java 7并发编程实战
可选的HTTP模块主要用于扩展标准的HTTP功能,使Nginx可以处理一些特殊的服务,例如:Flash多媒体传输、GeoIP请求解析、网络传输压缩、安全协议SSL支持等。
2.4. 邮件服务模块
邮件服务模块主要用于支持Nginx的邮件服务,包括对POP3协议、IMAP协议和SMTP协议的支持。
2.5. 第三方模块
第三方模块是对Nginx服务端应用进行扩展,完成开发者自定义功能,如:Json支持,Lua支持等。
3、Nginx请求处理
Nginx 是一个高性能的 Web 服务器,可以同时处理大量的并发请求。 它结合了多进程机制和异步机制。 异步机制采用异步非阻塞方式。 接下来介绍一下Nginx的多线程机制和异步非阻塞机制。
3.1. 多进程机制
每当服务器接收到客户端时,服务器主进程(master process)产生子进程(worker process)与客户端建立连接进行交互实战java高并发程序设计,直到连接断开,子进程结束。
使用进程的好处是每个进程相互独立,不需要加锁,减少了使用锁对性能的影响,降低了编程复杂度,降低了开发成本。
其次,使用独立进程可以避免进程之间相互影响。 如果一个进程异常退出,其他进程正常工作,master进程会迅速启动一个新的worker进程,保证服务不会中断,从而将风险降到最低。
缺点是操作系统需要进行内存复制等操作来生成子进程,在资源和时间上会产生一定的开销。 当有大量请求时,会导致系统性能下降。
3.2. 异步非阻塞机制
每个工作进程采用异步非阻塞方式,可以处理多个客户端请求。
当工作进程收到客户端的请求时,它会调用 IO 进行处理。 如果不能立即得到结果,则处理其他请求(即非阻塞),客户端在此期间不需要等待响应,可以处理其他请求。 事情(即异步)
当IO返回时,通知worker进程,通知进程暂时挂起当前正在处理的事务以响应客户端请求。
4. Nginx事件驱动模型
在Nginx的异步非阻塞机制中,worker进程调用IO后,会去处理其他的请求。 当 IO 调用返回时,将通知工作进程。
对于此类系统调用,主要采用Nginx服务器的事件驱动模型来实现,如下图所示:
如上图所示,Nginx的事件驱动模型由三个基本单元组成:事件收集器、事件发送器和事件处理器。
事件发送者将每个请求放入一个待处理事件列表中,并使用非阻塞 I/O 调用事件处理程序来处理请求。
其处理方式称为“多路IO复用方式”,常见的有以下三种:select模型、poll模型、epoll模型。
5. Nginx进程处理模型
Nginx服务器采用master/worker多进程模式,多线程启动和执行的过程如下:
主程序Master进程启动后,通过for循环接收并处理外部信号
主进程通过fork()函数生成worker子进程,每个子进程执行一个for循环,实现Nginx服务器对事件的接收和处理
一般建议worker进程数与CPU核数一致,这样就不会产生大量的子进程生成和管理任务,避免进程间争夺CPU资源和进程切换的开销。
而且,为了更好的利用多核特性,Nginx提供了CPU亲和性的绑定选项。 我们可以将某个进程绑定到某个核上,这样缓存就不会因为进程切换而失效。
对于每个请求,只有一个工作进程来处理它。 首先,每个工作进程都是从主进程派生出来的。 在master进程中,先设置好需要监听的socket(listenfd),然后fork多个worker进程。
当新连接到达时,所有工作进程的 listenfd 将变得可读。 为了保证只有一个进程处理连接,所有worker进程在注册listenfd读事件之前抢占accept_mutex
抢到互斥量的进程注册listenfd读事件,在读事件中调用accept接受连接。
当一个工作进程接受连接后,开始读取请求,解析请求,处理请求,生成数据,返回给客户端,最后断开连接,一个完整的请求是这样的。
我们可以看到一个请求是完全由worker进程处理的,而且只在一个worker进程中处理。
如下所示:
Nginx服务器运行过程中,主进程和worker进程需要进程交互。 交互依赖于 Socket 实现的管道。
5.1. 主进程与工作进程交互
这条管道不同于普通的管道。 是主进程到工作进程的单向管道,包括主进程发给工作进程的指令、工作进程ID等。 同时,主进程通过信号与外界通信; 每个子进程都有接收信号和处理相应事件的能力。
5.2. Worker进程与Worker进程交互
这种交互与主进程-工作进程的交互基本相同,只是会通过主进程间接进行,工作进程相互隔离。
因此,当工作进程W1需要向工作进程W2发送指令时,首先找到W2的进程ID,然后将正确的指令写入指向W2的通道实战java高并发程序设计,W2收到信号后采取相应的措施。
概括
通过本文,我们对Nginx服务器的整体架构有了一个整体的了解。 包括其模块化设计、多进程异步非阻塞请求处理、事件驱动模型等。
只有通过这些理论知识,才能更好的理解Nginx的设计思想。 对我们学习Nginx有很大的帮助。
我目前从事Java开发。 如果你正在学习Java技术,想学好Java,渴望成为一名Java开发工程师。 如果你在学习Java的过程中缺少基础入门视频教程,可以关注并私信我:01。 这里我有一套最新的 Java SE 密集视频教程,介绍 Java 的基础知识。 这套视频教程是我年初根据市场技术栈的需要录制的。 非常系统和完整。