nginx

一、简介

nginx是一个轻量级的http和反向代理服务器,占用内存少,并发能力强

二、相关概念

正向代理

程序要去访问一个地址,不直接访问,而是向一个代理服务器发送一个请求并指定目标地址,代理服务器访问目标地址,然后将结果返回给程序,资源服务就是程序指定的服务。例如代码里请求时,设置proxy;浏览器配置fiddler代理等。

反向代理

程序访问代理服务,代理服务可能自己没有资源,将请求转给另一个服务,然后将取到的结果返回给原程序,资源服务对于原程序来说是不可知的。

动静分离

将动态资源和静态资源分开存放,放到不同的服务器,这样就方便对静态资源做一些缓存。通过location将不同的资源请求转发到不同的服务,通过expires参数让浏览器进行缓存。

负载均衡

负载均衡就是把任务分摊到几个服务上去执行。有以下集中方式:

  • 轮询(默认)
  • 按权重。upstream可配置权重。
  • ip_hash。每个请求按访问 ip 的 的 hash 结果分配,这样每个访客固定访问一个后端服务器。
  • fair(第三方)。按后端服务器的响应时间来分配请求,响应时间短的优先分配。

三、高可用集群

高可用集群是基于keepalived实现的,架构图:


nginx高可用集群.png

什么是keepalived?

keepalived的作用一个是对外提供一个虚拟ip(VIP)让调用方访问,另一个是心跳检测,监测服务(如nginx)是不是挂了。他是基于协议VRRP(Virtual Router Redundancy Protocol,即虚拟路由冗余协议)来实现的:

VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。然而,在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话,就是master,或者是通过算法选举产生的,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等,其他设备不具有该IP,状态是BACKUP。除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能,当主级失效时,BACKUP将接管原先MASTER的网络功能。
VRRP协议配置时,需要配置每个路由器的虚拟路由ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0-255的整数;同一个组中的路由器通过使用优先权值来选举MASTER。优先权大者为MASTER,优先权也是一个0-255的正整数。

keepalived工作原理

keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能;keepalived是以VRRP虚拟路由冗余协议为基础实现高可用的,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

四、多进程工作模型

nginx进程模型.png

从上图中可以很明显地看到,4个worker进程的父进程都是master进程,表明worker进程都是从父进程fork出来的,并且父进程的ppid为1,表示其为daemon进程。
需要说明的是,在nginx多进程中,每个worker都是平等的,因此每个进程处理外部请求的机会权重都是一致的。
Master进程的作用是?
读取并验证配置文件nginx.conf;管理worker进程;
Worker进程的作用是?
每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。
Nginx如何做到热部署?
所谓热部署,就是配置文件nginx.conf修改后,不需要stop nginx,不需要中断请求,就能让配置文件生效!(nginx -s reload 重新加载/nginx -t检查配置/nginx -s stop)
修改配置文件nginx.conf后,重新生成新的worker进程,当然会以新的配置进行处理请求,而且新的请求必须都交给新的worker进程,至于老的worker进程,等把那些以前的请求处理完毕后,kill掉即可。
Nginx如何做到高并发下的高效处理?
Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的。worker只需要从epoll队列循环处理即可。

连接数worker_connection
worker_connection是一个worker支持的最大并发连接数。
浏览器发送1个请求,如果是请求静态资源,那就占用1个连接。如果是要反向代理的,那就占用2个。有时候浏览器一个接口会发送2次请求(第一次option),那就是占用4个连接了。
nginx支持的最大并发数:
普通的静态访问最大并发数是: worker_connections * worker_processes / 2
如果作为反向代理:worker_connections * worker_processes / 4

参考资料

Nginx篇——语雀
Keepalived基础知识详细完整总结
通俗易懂的Nginx工作原理

你可能感兴趣的:(nginx)