多进程模型
这里以windows为例(nginx for Windows是作为测试版本
的,生产环境还是要部在unix系统上,以获取高性能和可扩展性),进入Nginx的安装目录,打开cmd通过start nginx
命令启动。如果访问localhost能看到以下界面,说明启动成功:
如果启动失败,则需要查看logs\error.log
排除错误原因。
执行tasklist /fi "imagename eq nginx.exe"
命令可以查看nginx启动的进程:
tasklist
用于显示当前系统中正在运行的进程列表;
/fi
用于设置过滤条件,后面紧跟着过滤条件的定义;
"imagename eq nginx.exe"
是过滤条件的一部分,这个例子中,要求列出可执行文件(进程映像名称)是 “nginx.exe” 的进程。
可以看到,nginx默认启动了两个进程,一个是主进程(master)
,一个是工作进程(worker)
。
其他常用命令:
|
|
master&worker
master进程
主要用来管理worker进程,它的职能有:
- 接收来自外界的信号,例如新的链接请求,并向各worker进程发送信号;
- 监控worker进程的运行状态;
- 当worker进程退出后(异常情况),会自动重新启动新的worker进程。
worker进程
用来实际处理客户端请求,其启动数量由配置文件conf/nginx.conf
决定:
|
|
如果不显式设置,Nginx 会根据系统的 CPU 核心数量自动设置工作进程的数量。多个worker进程之间是对等的。他们同等竞争来自客户端的请求,各进程之间相互独立。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求
。
nginx进程模型如下所示:
由master作为父进程启动许多子进程,并且Nginx父子进程之间是通过信号来管理的。
优势
Nginx的这种工作模式,称为"matser-worker"模型
。它有诸多优势,主要包括:
- 允许 Nginx 处理大量并发连接,而无需为每个连接创建一个新的线程或进程;
- 每个工作进程相对独立,可以并行地处理多个请求,不需要加锁,省掉了锁带来的开销,在编程以及问题查找时,会方便很多;
- 一个worker进程异常退出后,会导致当前worker上的请求失败,但其它worker进程还在工作,服务不会中断,降低了风险。master进程会很快启动新的worker进程。
Q&A
nginx在windows系统与Unix系统中的运行模式有什么区别?
Windows系统中,nginx是作为一个控制台应用(非服务)运行的,需要一些额外的配置来实现类似服务的行为。
而Unix系统中,nginx会以daemon的方式在后台运行。
nginx默认多进程方式运行,那它支持多线程的方式吗?两者有什么区别?
nginx支持多线程方式运行,但采用多进程的方式运行相对来说有更多优势。
- nginx最核心的一个目的是要保持
高可用性
、高可靠性
,多进程方式在生产环境可以更好的利用多核
这一特性; - 线程之间是共享同一个地址空间的,假如Nginx使用的是多线程结构,当某一个第三方模块引发了一个地址空间导致的
段错误
、在地址越界
出现时,会导致整个Nginx进程全部挂掉,多进程模型就不会出现这样的问题。