nginx原理

在nginx启动后,会有一个master进程和多个worker进程,master进程主要用来管理worker进程。

  • master进程用来管理worker进程,包括:接受信号,将信号分发给worker进程,监听worker进程工作状态,当worker进程退出时(非正常),启动新的worker进程。基本的网络事件会交给worker进程处理。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。

worker进程工作方式

  • 基本的网络事件是放在worker进程中来处理。多个worker进程之间是对等的,它们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理;一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。

一个master有多个worker的机制的好处

  • 可以使用nginx –s reload热部署,利用nginx进行热部署操作。执行此命令后master会重新加载配置文件,然后启动新的进程,使用的新的worker进程来接受请求,并告诉老的worker进程他们可以退休了,老的worker进程将不会接受新的,老的worker进程处理完手中正在处理的请求就会退出。

  • 每个woker是独立的进程,如果有其中的一个woker出现问题,其它woker独立的,继续进行争抢,实现请求过程,不会造成服务中断。

需要设置多少个worker?

  • nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是千上万个请求也不在话下。每个worker的线程可以把一个cpu 的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。 (worker_processes)

连接数worker_connection

  • 这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections*worker_processes。当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections*worker_processes,如果是支持http1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是:worker_connections*worker_processes/2,而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections*worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接会占用两个连接。