一、简介
概念:是一款轻量级、高并发的web服务器
特性:高并发,理论上能够支持高达5万并发连接数;轻量级,占用内存少
作用:
(一)高并发(量)
1、什么叫高并发:通过设计保证系统能够同时并行处理很多请求。
参数(指标):
响应时间(Response Time):系统对请求做出响应的时间。
吞吐量:单位时间内处理请求的数量。
并发用户数:同时承载正常使用系统功能的用户数量。
2、高并发的原理:
为什么能够实行高并发---采用了“多进程+异步非堵塞”模式
问题一:什么叫多进程
一个 Master 进程、多个 Worker 进程:
① nginx在启动之后,会有一个master进程和并由master生成多个独立的子进程---worker进程
② master进程负责接收来自外界的连接,并向worker进程发送信号,并由worker进程来处理请求的事件;
③ master进程也能监控worker检查的运行状态,当worker进程退出后(异常情况下),会自动启动新的worker进程。
问题二:woker进程非常多,master进程如何选定并交给其中一个处理
多个work进程同时争抢处理一个请求:惊群现象---当连接进来的时候,所有子进程都将收到master进程的通知并争着和它建立连接,这就叫惊群现象。
多个进程同时争抢处理一个请求的弊端:大量的子进程被激活又挂起,最终只有一个进程获取到这个连接,这会浪费系统资源。
解决方法:nginx对惊群现象的处理--accept_mutex(加锁)
nginx提供了一个accept_mutex这个东西,即每个worker进程在执行accept(接受)之前都需要先获取锁,获取不到就放弃执行accept()的程序。
有了这把锁之后,同一时刻就只有一个进程去accept(),这样就不会出现惊群现象。
处理请求的完整过程:
①在 Master 进程里面,先建立好需要 listen 的 socket(listenfd)之后,然后再 fork 出多个 Worker 进程。
②所有 Worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有 Worker 进程在注册 listenfd 读事件前抢互斥锁accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,在读事件里调用 accept 接受该连接。
③当一个 Worker 进程在 accept 这个连接之后,就开始读取、解析、处理请求,在产生数据后再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求完全由 Worker 进程来处理,而且只在一个 Worker 进程中处理。
(二)负载均衡(量多的缓冲机制)
1、概念:将工作任务(负载)分摊到多个服务器上,从而协同工作工作任务。
2、应用分类:
根据性质分类:HTTP负载均衡、IP负载均衡、反向代理负载均衡。
根据OSI的层次分类:
(1)二层负载均衡(了解):负载均衡服务器对外依然提供一个VIP(虚拟ip),集群中不同的机器采用相同IP地址,但MAC地址不一样---当负载均衡服务器接受到请求之后,通过修改报文的目标MAC地址的方式请求转发到目的机器实现负载均衡。
(2)三层负载均衡:和二层负载均衡类似,负载均衡服务器对外仍然提供一个VIP(虚拟IP),但集群中不同的机器采用不同的IP地址。当负载均衡服务器接受到请求之后,根据不同的负载均衡算法,通过IP将请求转发到不同的真实服务器上。
(3)四层负载均衡:四层负载均衡工作在OSI模型的传输层,只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还包含源端口及目标的端口号。四层负载均衡服务器在接受到客户端请求后,通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。
(4)七层负载均衡:七层负载均衡工作在OSI模型的应用层,应用层协议较多,常用http、DNS、radius等。七层负载就可以基于这些协议来负载---这些应用层协议中包含很多有有意的内容,比如同一个web服务器的负载均衡,除了根据IP加端口进行负载外,还可以根据七层的URL、浏览器类别、语言来决定负载均衡
3、负载均衡的好处:
①工作效率高:由于是协同合作,因此工作速度更快,效率更高。
②拓展性强:当业务量增加的时候可以通过增加服务器来满足需求(且不影响现有业务质量)。
③高可靠性:单台服务器故障时,由负载均衡设备将后续业务转向其他服务器,不影响后续业务提供,保证业务不中断。
④安全防护:在负载均衡设备上做一些过滤,比如黑白名单的处理。
(三)反向代理(安全考虑---质)
1、概念
先理解正向代理:
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。代理对象是客户端,不知道服务端是谁。
反向代理:
客户端不需要任何配置就能访问,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外就一个服务器,暴露的是反向代理服务器地址,隐藏了真实服务器IP地址。代理对象是服务端,
2、负载均衡原理:
3、负载均衡算法:
①轮询(Round Robin):把来自用户的请求轮流分配给内部的服务器----从第一个服务器开始,直到第N个服务器,然后重新开始循环。
②权重轮询算法:根据服务器的不同处理能力,给没他服务器分配不同的权值,使其能够接受相应权值的服务请求。
例子:假设四台服务器的处理能力为3:1:1:1
由于权重轮询调度算法考虑到了不同服务器的处理能力,所以这种均衡算法能够确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。所以在实际应用中比较常见。
4、常用负载均衡的工具
常用的软件负载均衡软件有nginx、LVS、Haproxy
①nginx主要用来做七层负载均衡
拓展:
对于一般的应用而言,有了Nginx就够了(nginx可以用来七层负载均衡)。但是对于一些大的网站而言,一般会采用DNS负载+四层负载+七层负载的方式进行多层次负载均衡。
②LVS(Linux Virtual Server)主要是用来做四层负载均衡。
二、nginx的大致架构:
我们可以将Nginx服务器的结构大致分为主进程、工作进程、后端服务器和缓存等部分。
①主进程: Master 进程
②工作进程:Woker 进程。
其实除了 Master 进程和 Woker 进程之外,Nginx 中还有两个特殊用途的进程:缓存加载器进程(Cache Loader )和 缓存管理器进程(Cache Manager)。
③缓存加载器进程(Cache Loader ):
Cache Loader 进程是在Nginx服务启动一段时间后由主进程生成,在缓存元数据重建完成后就自动退出。
④Cache Manager进程一般存在于主进程的整个生命周期,负责对缓存索引进行管理。通过缓存机制,可以提高对请求的响应效率,进一步降低网络压力。
三、nginx的功能模块
(一)配置文件:
/etc/nginx/nginx.conf :nginx的全局配置文件
/etc/nginx/conf.d :nginx的局部配置文件
(二)nginx配置文件的整体结构:
(1)全局块
配置影响nginx全局的指令。主要包括:
①配置允许nginx服务器的用户(用户组)
②worker process数
③nginx进程
④PID存放路径、错误日志的存放路径
⑤配置文件的引入
(2)events块
配置影响nginx服务器或与用户的网络连接。主要包括:
①设置网络连接的序列化
②是否允许同时接受多个网络连接
③事件驱动模块的选择
④最大连接数的配置
(3)http块
配置代理,缓存,日志文件等绝大数功能和第三方模块的配置:
1)http全局块
①定义MINI-Type
②自定义服务日志
③允许sendfile方式传输文件
④连接超时时间
⑤单连接请求数上限
2)server块
配置虚拟机本身的相关参数,一个http中可以有多个server。主要包括:
①配置网络监听
②基于名称的虚拟机配置
③就IP的虚拟机配置
3)location块
配置请求的路由,以及各种页面的处理情况。主要包括:
①location配置
②请求根目录配置更改
③location的URL
④网站默认首页配置