Nginx的原理解析

47 阅读2分钟

bac2baddd1fd4dbe9a6115c3e1fcd72.png 从上图可以看到 一个mastrer进程底下有多个woker进程 4332e12c2a1247e1829411ad0e29537.png 在这张图我们可以看到,当client(客户端)发送请求,请求到nginx中,首先到master,当master收到请求后,通知它底下的woker,因为一个master下面有多个woker,而且nginx本身也是不直接支持java的,在进行ava操作时还需要依赖我们tomcat,woker可能还需要做一些请求转发或者反向代理通过我们tomcat查询数据库获取结果,所以woker是采用的争抢机制去获取任务

一个master和多个woker有什么好处?

对于每个woker都是独立的进程,不需要加锁。所以省掉了锁带来的开销,同时再变成以及问题查找的时候,也会方便很多。其次独立的进程互相之间并不影响,一个进程退出后其他的进程还会继续工作。当然woker进程的异常退出肯定就是程序出BUG了,所以才异常推出,会导致当前woker中的所有请求失败,但是并不会影响其他的woker进程,所以设计多个woker还降低了风险

需要设置多少个woker才最合适呢?

Nginx和redis类似都采用了 io多路复用机制(windos系统没有这个机制),每个woker都是一个独立的进程,但它的每个进程只有一个主线程,通过异步阻塞的方式处理请求,即便有成千上万请求也没问题,每个worker的线程都可以把一个cpu发挥到极致,所以worker数量设置成和服务器的cpu数量一样的会最合适,设置多了吧就造成cpu频繁切换上下文带来的损耗。

发送一个请求 会占用worker连接数几个?

如果调用的是静态资源 发送请求一个 请求返回一个,所以是两个; 刚刚我们已经说了Nginx不支持java,当我们需要访问数据库获取数据的时候,就需要额外用到两个作为请求和返回去调用tomcat,让tomcat去和数据库完成交互,所以是四个。

nginx最大并发数怎么计算?

普通的静态访问最大并发数:worker_connections(连接数)*worker_processes(数量)/2;

http作为反向代理来说最大并发数就要除以4 因为它的worker连接数是4。