2

NGINX的并发模型

 2 years ago
source link: https://xusiwei.github.io/post/2016/nginx-concurrency-model/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

NGINX的并发模型

2016年3月9日

Apache 的并发模型

Apache 的早期版本的并发模型是 one process per connection,也是早期Unix服务端的主流模型: 主进程accept阻塞在listen fd上,有新的HTTP请求到来时(accept返回connection fd),主进程fork一个服务进程, 专门为该连接服务,HTTP会话结束退出此进程。

Apache 后来的版本,改用one thread per connection,改用单独一个线程为客户端连接提供服务。 这个模式和之前版本的一样,listen fd和connection fd用的都是阻塞模式。

使用阻塞模式的好处是,逻辑清晰,编程模型简单。process per connection的好处还有可以保证客户端连接的稳定性 (据说早期Unix的某些版本上多进程模型并不稳定),同时也保证了安全性(即使客户端通过hack手段在connection上拿到了shell也只能控制服务进程)。

Tomcat 使用的并发模型也是 one thread per connection。开发环境下,在servlet或jsp代码中上打断点, 在有超过一个浏览器访问有断点的servlet时,能够看到Tomcat为每个连接创建了一个线程。

这种模型下,单个服务器的服务能力主要受到内存的限制,因为每创建一个进程/线程都要消耗一定数量的内存(MB级别)。

NGINX 的并发模型

NIGNX 支持 single 模式 和 master + worker 模式。

NGINX master + worker 模式

NGINX通常工作在master + worker模式下,master和worker都是单线程的进程,用户可以通过增加worker进程数实现提高多核CPU的利用率。 同时,这种每个进程仅有一个线程的模型,使得不需要时刻考虑数据的保护问题(如果是多线程则需要考虑)。

来自Andrew Alexeev的一张图: NGINX architecture

master 进程

NGINX的master进程,负责解析配置文件,并启动其他角色的进程,如启动worker,cache manager。

启动完成其他进程之后,master进程仅起监视作用(相当与monitor角色),后面用户可以通过singaller角色的nginx向master发命令, master再通知它创建起来的其他进程。

worker 进程

worker进程是实际服务客户的进程。包括接受新连接(accept),相应连接上的消息(read/write).

singaller 进程

singaller进程仅仅是一个向master进程发送信号的工具进程。 通过向master发生特定消息,能够让: * master/worker完成当前服务后,正常退出。 * master进程重新加载配置文件,或者重启worker。 * 重新打开log 文件。

cache manager

可以做 HTTP、文件缓存,即对同一个静态文件的请求进行缓存。

Chapter “nginx” in “The Architecture of Open Source Applications”


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK