Featured image of post Nginx工作原理(上)-Nginx进程模型

Nginx工作原理(上)-Nginx进程模型

Nginx的多进程模型...

多进程模型

这里以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)

其他常用命令:

1
2
3
4
5
6
7
8
# 查看nginx命令手册
nginx -h

# 强制停止nginx进程
nginx -s stop

# 优雅停止nginx进程,并保存相关信息
nginx -s quit

master&worker

master进程主要用来管理worker进程,它的职能有:

  1. 接收来自外界的信号,例如新的链接请求,并向各worker进程发送信号;
  2. 监控worker进程的运行状态;
  3. 当worker进程退出后(异常情况),会自动重新启动新的worker进程。

worker进程用来实际处理客户端请求,其启动数量由配置文件conf/nginx.conf决定:

1
2
# 通常设置与机器cpu核数一致
worker_processes  1;

如果不显式设置,Nginx 会根据系统的 CPU 核心数量自动设置工作进程的数量。多个worker进程之间是对等的。他们同等竞争来自客户端的请求,各进程之间相互独立。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求

nginx进程模型如下所示:

由master作为父进程启动许多子进程,并且Nginx父子进程之间是通过信号来管理的。

优势

Nginx的这种工作模式,称为"matser-worker"模型。它有诸多优势,主要包括:

  1. 允许 Nginx 处理大量并发连接,而无需为每个连接创建一个新的线程或进程;
  2. 每个工作进程相对独立,可以并行地处理多个请求,不需要加锁,省掉了锁带来的开销,在编程以及问题查找时,会方便很多;
  3. 一个worker进程异常退出后,会导致当前worker上的请求失败,但其它worker进程还在工作,服务不会中断,降低了风险。master进程会很快启动新的worker进程。

Q&A

nginx在windows系统与Unix系统中的运行模式有什么区别?

Windows系统中,nginx是作为一个控制台应用(非服务)运行的,需要一些额外的配置来实现类似服务的行为。

而Unix系统中,nginx会以daemon的方式在后台运行。

nginx默认多进程方式运行,那它支持多线程的方式吗?两者有什么区别?

nginx支持多线程方式运行,但采用多进程的方式运行相对来说有更多优势。

  1. nginx最核心的一个目的是要保持高可用性高可靠性,多进程方式在生产环境可以更好的利用多核这一特性;
  2. 线程之间是共享同一个地址空间的,假如Nginx使用的是多线程结构,当某一个第三方模块引发了一个地址空间导致的段错误、在地址越界出现时,会导致整个Nginx进程全部挂掉,多进程模型就不会出现这样的问题。

references

Nginx for Windows官方文档

nginx入门手册

nginx为什么使用多进程而不是多线程-知乎

我的玫瑰,种在繁星中的一颗~
Built with Hugo
主题 StackJimmy 设计