1. Nginx进程结构:
Nginx有两种进程结构:一种是 单进程结构,一种是 多进程结构。
单进程结构实际上不适用于生产环境,只适合在开发、调试时使用。这是因为在生产环境中需要保证Nginx足够健壮,且能够充分利用 CPU多核的特性。
因此默认配置中也是打开多进程的Nginx。
2. Nginx多进程结构:
Nginx多进程结构下,进程种类有三类:
master进程 + worker进程 + cache进程
Master进程的功能是用来管理Worker进程,真正处理用户请求的是Worker进程,Master进程负责监控每一个Worker进程是否在正常工作、是否需要热部署等。
Cache进程负责对上游服务器发来的动态请求响应做缓存处理,缓存是需要在多个worker进程间共享的,CL进程(Cache Loader)负责做缓存的载入,CM进程(Cache Manager)负责做缓存的管理,实际上如果需要对用户请求返回缓冲中的内容,则还是由Worker进程来处理。
Worker进程的个数:
Master进程只有一个,Cache进程分别有一个Manage进程和一个Load进程。
对于Worker进程,一般配置为与CPU的核数一致,Nginx希望每一个Worker进程从头到尾占有一个核。
因此在配置Nginx时,除了需要把Worker进程的数量配置成与CPU核数一致外,还需要把Worker进程与某一个CPU核绑定,这样可以更好的使用每个核上的CPU缓存,提高缓存命中率。
另外,在配置Nginx时也会把Nginx的进程优先级调到最高,这样在操作系统进行进程调度时会为Nginx分配更多的时间片,从而减少无谓的进程间切换。
Nginx多进程结构示意图:
3. 为什么Nginx使用的是多进程结构而不是多线程结构?
最核心的目的,就是要保证Nginx的高可用性和高可靠性。
如果Nginx使用多线程结构,因为线程之间是共享内存地址空间的,如果某个第三方模块因为内存地址访问越界等问题引发了段错误,将会导致整个Nginx进程都挂掉。而采用多进程结构则基本不会出现这样的问题。
Nginx在多进程结构设计上同样遵循了实现高可用性、高可靠性的思路:
在Master进程中,通常第三方模块是不会加入功能代码的。虽然Nginx允许第三方模块在Master进程中添加独有的、自定义的一些方法,但是通常没有第三方模块会这么做。