您的位置:首页 > 运维架构 > Nginx

3-nginx进程模型

2018-04-07 12:16 411 查看

1. nginx进程模型

安装完nginx后,接下来了解nginx的进程模型和工作的基本原理。如果想要深入了解nginx内部实现的,推荐Nginx开发从入门到精通。传送门:http://tengine.taobao.org/book/

nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。当然nginx也是支持多线程的方式的, 只是我们主流的方式还是多进程的方式,也是nginx的默认方式。

nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。nginx的进程模型,可以由下图来表示(摘自nginx从入门到精通):



为什么worker进程数量设置得与CPU核数一样?这也是nginx和apache服务器不同的地方。

apache服务器的每个进程同一时刻只能处理一个请求,如果要处理高并发请求就需要设置成百上千个进程或线程,也就是说一台服务器会有几百个工作进程在运行,这么大量进程间切换会占用大量的系统资源。

而nginx的一个worker进程可以同时处理的请求数量受制于内存大小,在架构设计上,不同worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会阻塞挂起,因此,nginx上的进程数和cpu核数相等时,进程间切换的消耗是最小的。

2. nginx进程模型的好处

对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。

采用独立的进程,互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。

如果worker进程的异常退出,会导致当前worker上的所有请求失败,不过不会影响到其他worker进程的所有请求,所以降低了风险。

3. 从nginx进程模型了解nginx重启

前面在介绍nginx重启的方式时,遗留了一个问题: 对于./nginx -s reload这种不用让nginx重启就能让nginx.conf配置文件生效,到底是怎么做到的呢?

我们来看一下./nginx -s reload命令到底做了什么操作。

当我们打开bash终端输入并执行nginx -s reload命令时,linux系统会发送一个SIGHUB信号,该信号的默认动作是终止进程,当master进程收到bash终端发送的SIGHUB信号时,会把SIGHUB信号转发给下属的所有worker进程,而worker进程收到SIGHUB信号的处理方式主要有以下几种情况:

对于正在工作中的worker进程来说,如果收到SIGHUB信号不会立刻终止worker进程,而是先把请求处理完毕,然后再终止worker进程并重启,重启后的worker进程会重新加载nginx.conf配置文件。

对于正处于空闲状态的worker进程,如果收到SIGHUB信号会立刻终止worker进程并重启,然后重新加载新的nginx.conf配置文件。

从上面来看,我们知道mster进程主要的工作是管理worker进程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息