负载均衡算法
1.round robin(默认)轮询算法
适用于后台机器性能一致的情况。
挂掉的机器可以自动从服务列表中剔除。
2.weight
根据权重来分发请求到不同的机器中,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3. IP_hash
根据请求者ip的hash值将请求发送到后台服务器中,可以保证来自同一ip的请求被打到固定的机器上,
4.url_hash(第三方)
根据请求的url的hash值将请求分到不同的机器中,当后台服务器为缓存的时候效率高。
1.为什么nginx采用多进程结构而不使用多线程结构?
答:nginx要保证它的高可用性和高可靠性。当采用多线程时,线程之间是共享同一个地址空间的,当某一个第三方模块引发了由地址空间导致的“段”错误时,在地址越界出现时,会导致整个nginx进程全部挂掉!多进程则不会出现这种问题
2.master进程是用来管理worker进程的,所有的请求实际是由worker进程去完成的。master进程负责监控每个worker进程是不是在正常工作!进程间的通信都是使用共享内存解决的
3.每个worker进程占有绑定一个cpu,这样可以更好的利用CPU核上面的CPU缓存来减少缓存失效的命中率。
4.nginx -s reload流程
1向master进程发送HUP信号(reload命令)
2master进程校验配置语法是否正确
3master进程打开新的监听端口
4master进程用新的配置启动新的worker子进程
5master进程向老worker子进程发送QUIT信号
6老worker进程关闭监听,处理完当前连接后结束进程
5.热升级流程
1将旧nginx文件换成新nginx文件
2向master进程发送USR2信号
3master进程修pid文件名,加后缀.oldbin
4master进程用新nginx文件启动新master进程(新master进程是老master进程的子进程)
5向老master进程发送QUIT信号,关闭老master
6回滚:向老master发送HUP,向新master发送QUIT
6.优雅的关闭
1设置定时器worker_shutdown_timeout(定时器)
2关闭监听句柄
3关闭空闲连接(关闭已经不用的连接)
4在循环中等待全部关闭连接(看哪些连接执行完就关闭,当设置定时器时间到了后还有未执行完的连接,此时全部强制断开)
5退出进程
7.并发请求量大的情况下nginx是如何处理的?
传统的请求
如果每一个请求是http请求,可以将其简化为3部分
1)收到http请求的header,收到后就知道需要交给上游的哪台服务器去处理,
2)再向上游服务器建立连接,
3)或者本地处理时看header中是否有content-length(是否有body),如果有body,接下来去读另一个读事件,处理完httpbody后发送一个http响应
比如Tomcat处理上图进程中,每个进程同一时间只处理一个请求,比如process1在处理网络事件条件不满足就会切换到process2,当process2由不满足时又切换到process3(处于满足状态),当process3用完时间片后会被操作系统再次进行切换,而每次切换大约会消耗5us时间,若并发连接和并发进程数增加时,这个增加幅度为指数级!所以会消耗CPU绝大部分计算能力,这种传统的web服务依赖于操作系统的进程调度方法,来实现并发连接数。操作系统调度仅适用于几百上千的进程间切换。上万级别就不能接受了!!
nginx处理方法
当蓝色的请求处理事件不满足的情况下,它在用户态直接切换到了绿色的请求,这样省去了进程间切换的时间成本(因为网络事件不满足),除非nginx使用的时间片已经用完,时间片的长度一般为5ms-800ms,在nginx的worke配置上把优先级调至最高(如:-19),这样操作系统给nginx分配的时间是比较大,nginx就能完成用户态请求的切换,使得CPU少做无用功
8.正向代理和反向代理
正向代理:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容代理服务器去取回来,然后返回给我,正向代理是服务于客户端的
反向代理:例用户访问 http://ooxx.me/readme,但ooxx.me上并不存在readme页面,他是偷偷从另外一台服务器上取回来,然后作为自己的内容吐给用户