Nginx 原理以及参数配置

Nginx 的 master-worker 机制

  1. 一个 Nginx 是由一个 master 主进程,与多个 worker 进程组成。
  2. master 进程负责监听客户端发来的请求。
  3. 而 worker 进程主要负责争抢 master 进程接收到的连接数,最后有 worker 进程负责将请求转发到相应的 Tomcat(负载均衡)。对于静态资源,worker则不需要转发请求,直接返回静态资源给客户端。
  1. 客户端向 Nginx 发起请求;
  2. 由 master 进程监听客户端发来的请求;
  3. master 监听到客户端发来的请求之后,会通知 worker。worker 负责争抢请求;
  4. 如果请求是静态资源,则 worker 会直接将静态资源返回给客户端;如果是动态资源,worker 则会将资源分发给 tomcat 处理;这种争抢策略的好处是:可以极大的提高 Nginx 的并发效率


注:当 worker 的数量与 CPU 数量一致时 Nginx 的效率最高。因为每一个 worker 就是一个进程,worker 的数量与 cpu 一致时,每一个 worker 都会绑定一个 cpu。过少则会空出 cpu,使多余 cpu 空闲;过多则会导致 cpu 来回切换进程,消耗时间;

master-worker 机制的好处

  1. 首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
  2. 其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。
  3. 当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

worker 的数量

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

#work绑定cpu(4 work绑定4cpu)。
worker_cpu_affinity 0001 0010 0100 1000

#work绑定cpu (4 work绑定8cpu中的4个) 。
worker_cpu_affinity 00000001 00000010 00000100 00001000

Nginx 连接数问题

worker_processes 4;
worker_connections 1024;
  1. Nginx 能够支持的最大链接数为:worker_processes * worker_connections
  2. Nginx 所能支持的最大并发数:
    静态资源:worker_processes * worker_connections / 2
    动态资源:worker_processes * worker_connections / 4

因为,Nginx 中 worker 进程是采用异步非阻塞

  1. 当 master 监听到 w请求后,worker 会与 master 建立一次链接之后见断开。
  2. 如果请求的是静态资源,则 worker 会再次与 master 建立链接返回静态资源给客户端后断开链接
    所以对于静态资源所能支持的最大并发数为:worker_processes * worker_connections / 2;
  3. 如果是动态链接,worker 还有与 tomcat 建立两次链接
    所以动态链接所能支持的最大并发数为:worker_processes * worker_connections / 4;
posted @ 2022-05-03 21:08  ayi8  阅读(81)  评论(0)    收藏  举报