nginx原理剖析

当我们启动nginx服务之后,可以使用如下命令查看nginx进程

显然易见,nginx大致分为master以及worker两部分:

master-workers 机制

首先./nginx -s reload是一个热部署命令:不影响正在使用的worker,其他空闲worker会进行重新加载,待到忙碌的worker工作完毕在执行重新加载

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

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

当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

需要设置多少个 worker

Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。

每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。

#设置 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)

问题一:发送请求,占用了 woker 的几个连接数?

答案:2 或者 4 个

解析:访问静态资源,往返代表2个

若是worker要访问数据库,需要走tomcat,此处worker与tomcat之间的往返又是2个

问题二:nginx当中所有worker的最大连接数?

连接数worker_connection表示每个 worker 进程所能建立连接的最大值(往返连接算作两个),所以,一个 nginx 能建立的最大连接数,应该是单个worker的最大连接数*worker个数,即worker_connections * worker_processes。

当然,这里说的是最大连接数,,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访

问题三:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?

普通的静态访问最大并发数是: worker_connections * worker_processes /2=1024*4/2=2048

而如果是 HTTP作为反向代理来说,因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会额外占用两个连接。最大并发数量应该是 worker_connections * worker_processes/4=1024*4/4=1024

posted @ 2020-08-01 16:31  月半大熊猫  阅读(201)  评论(0编辑  收藏  举报