Nginx工作原理:master-worker
一. 问题引出
在linux中启动nginx, 会发现开启了不止一个进程, 如下图:
其中一个master进程, 四个worker进程.
二. 原理
master负责将请求分配给手下的worker, worker接到分配的请求来做具体的事情. 所有的worker并不是轮询来处理master的请求, 而是采用"争抢"机制:
1. master-worker有什么好处呢?
(1) 可是使用nginx -s reload来实现热部署;
(2) 每个worker都是独立的进程, 不需要加锁, 避免了锁带来的开销. 如果一个worker出现问题, 其他worker进程可以继续进行争抢, 实现请求过程不会造成中断.
2. worker设置多少个合适呢?
答: 设置为何cpu核心数相等的个数最为适宜, 如下图:
nginx和redis类似, 都采用了io多路复用机制, 每个worker都是一个独立进程, 每个进程里只有一个主线程, 通过异步非阻塞的方式来处理请求. 所以worker和服务器的cpu数相等最为适宜. 设置少了会浪费cpu, 多了会造成cpu频换切换上下文带来损耗.
注: windows系统并没有上面所说的io多路复用机制, 所以windows下的nginx并不能将性能最大化.
3.worker_connections连接数相关问题
(1) 一个请求过来, worker要占用几个连接数?
答: 2个或4个;
如果是访问静态资源, 不经过tomcat, 则为2个连接数;
如果访问作为反向代理, 访问tomcat, 则为4个连接数;
(2) 如果一个nginx有1个master, 4个worker, 每个worker支持最大连接数1024, 那么支持的最大并发是多少?
答:
访问静态资源, 最大并发数= 4 * 1024 / 2
访问动态资源: 最大并发数= 4 * 1024 / 4
公式:
静态资源: worker_processes * worker_connections / 2
HTTP反向代理: worker_processes * worker_connections / 4