nginx大概工作机制
1.master和worker
nginx启动后,会有2种进程:worker和master;worker可能有多个;
master进程负责管理分配任务,worker进程负责实际工作;
worker工作机制:
当客户端发送一个请求后,master接收请求,然后后分配给worker;
分配的机制为争抢;worker抢到任务后将利用反向代理请求tomcat;
一个master和多个worker的好处:
1】可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作
线上部署的服务器一般不会停止,如果停止可能会造成问题;
有多个worker,worker1抢到了任务,此时服务器使用 nginx –s reload重加载;
此时又来了一个新的请求,worker1因为有任务而不会再参与争抢;
其它worker会去争抢任务,它们得到的是重新加载后的内容;
worker1在执行完任务后,也会重新加载,而得到加载后的内容;
2】每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,
继续进行争抢,实现请求过程,不会造成服务中断
设置多少个worker合适:
Nginx 同 redis 类似都采用了 io 多路复用机制;
每个 worker 都是一个独立的进程,
但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。
每个 worker 的线程可以把一个 cpu 的性能发挥到极致。
所以 worker 数和服务器的 cpu数相等是最为适宜的。
设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
Nginx和redis通常都是装在linux系统中的,也可以装载windows系统中;
但装载windows系统中时就没有io多路复用机制;
也就是说,nginx在windows中功能虽然有,但并不能把它的性能发挥到最大;
设置worker数量:
worker_processes 4
#work 绑定 cpu(4 work 绑定 4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
#work 绑定 cpu (4 work 绑定 8cpu 中的 4 个) 。
worker_cpu_affinity 0000001 00000010 00000100 00001000
worker连接数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。
因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
第一个:发送请求,占用了 woker 的几个连接数?
答案: 2 或者 4 个;
如果是请求静态资源,需要worker连接客户端要2个连接数;
如果是反向代理,worker需要谅解客户端2个连接数,加上worker和tomcat的两个连接数;
第二个: nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的
最大并发数是多少?
普通的静态访问最大并发数是: worker_connections * worker_processes /2,
而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections *
worker_processes/4。