需要学会的Nginx知识——负载均衡和缓存
操作系统:CentOS-7.8
nginx版本:1.18.0
Tomcat版本:9.0.36
在上一篇文章中我们对Nginx进行了简单介绍,也学习了nginx的基本配置和操作,今天这次我们将学习Nginx在生产中常被使用的功能负载均衡和缓存加速。上一篇文章
一、概念
1.OSI七层网络模型
OSI七层网络模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系
应用层。网络服务与最终用户的一个接口,与用户交互
应用层是与用户最近的一层,应用层为用户提供了交互接口,以此来为用户提供交互服务。在这一层常用的协议有HTTP,HTTPS,FTP,POP3等。
表示层。数据的表示、安全、压缩
表示层提供数据格式编码以及加解密功能,确保从请求端发出的数据到响应端能被识别。
会话层。创建、管理和销毁会话
会话存在于从请求发出到接受响应这个过程之间,会话层充当这一过程的管理者,包括会话创建、维持到销毁
传输层。定义传输数据的协议端口号,以及流控和差错校验等功能
传输层创建以及管理端到端的连接,提供数据传输服务。在传输层常见的协议是TCP、UDP协议
网络层。进行逻辑地址寻址,实现不同网络之间的路径选择
数据链路层。建立逻辑连接、进行硬件地址寻址、差错校验,提供介质访问和链路管理
物理层。传输介质,物理媒介
物理层是端到端通信过程的物理介质,实际最终信号的传输都是通过物理层实现的。常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆等,这些都是物理层的传输介质。
2.负载均衡
负载均衡是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,在网络应用中就是根据请求的信息不同,来决定怎么样转发流量。
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
在OSI七层网络模型的基础上,负载均衡也有不同的分类,主要有以下几种
四层负载:基于IP和端口,通过虚机的IP+端口接收请求,然后再分配到真实的服务器,LVS是典型的四层负载均衡应用
七层负载:基于应用信息,通过虚机主机名或者URL接收请求,再根据一些规则分配到真实的服务器,nginx就是典型的七层负载均衡应用
二、配置
1、负载均衡策略
轮询
轮询策略下,所有上游服务器被访问到的概率是一致的,且是按照一定的顺序依次被请求到。如下示例配置,hdh100:9001、hdh100:9002和hdh100:9003三台tomcat服务器依次被请求,每刷新一次就切换一次。
1#上游tomcat集群
2upstream www.learn.com{
3 server hdh100:9001;
4 server hdh100:9002;
5 server hdh100:9003;
6}
7
8#反向代理服务器
9server {
10 listen 80;
11 server_name www.learn.com;
12
13 location / {
14 proxy_pass http://www.learn.com;
15 }
16}
加权轮询
加权轮询策略下,是按照每个上游服务器分配的权重不同处理的连接数也不同,权重越大,被访问到的次数就越多。如下示例配置,hdh100:9001、hdh100:9002和hdh100:9003的权重分别是1,3,5,权重越大,被分配的流量就越多。
1#上游tomcat集群,后面weight就是配置权重,在设置weight时,默认权重是1
2upstream www.learn.com{
3 server hdh100:9001 weight=1;
4 server hdh100:9002 weight=3;
5 server hdh100:9003 weight=5;
6}
7
8#反向代理服务器
9server {
10 listen 80;
11 server_name www.learn.com;
12
13 location / {
14 proxy_pass http://www.learn.com;
15 }
16}
ip_hash
ip_hash是根据用户的ip进行hash散列将其请求分配到指定上游服务器。在用户ip没有发生变化的情况下,且上游服务器无变更时,用户的多次请求都会被转发到同一台上游服务器。
1upstream www.learn.com{
2 ip_hash;
3
4 server hdh100:9001 weight=1;
5 server hdh100:9002 weight=3;
6 server hdh100:9003 weight=5;
7}
url_hash
url_hash策略是根据url进行hash散列将其请求分配到指定的上游服务器。同一个url在上游服务器没有发生变更的情况下是请求到同一台服务器。
1upstream www.learn.com{
2 hash $request_uri;
3
4 server hdh100:9001 weight=1;
5 server hdh100:9002 weight=3;
6 server hdh100:9003 weight=5;
7}
last_conn
last_conn将流量分发到当前连接数最少的服务器上的一个策略
1upstream www.learn.com{
2 least_conn;
3
4 server hdh100:9001 weight=1;
5 server hdh100:9002 weight=3;
6 server hdh100:9003 weight=5;
7}
2、优化配置
max_conns
限制上游服务器的最大连接数,用于保护避免过载,可以起到限流的作用,在nginx1.11.5之前,该配置只能作用于商业版本的nginx,默认值是0表示没有限制,配置如下:
1#上游服务器配置,每个服务器都可以设置max_conns
2upstream www.learn.com{
3 server hdh100:9001 max_conns=200;
4 server hdh100:9002 max_conns=200;
5 server hdh100:9003 max_conns=200;
6}
slow_start
缓慢开始,当我们给上游服务器设置权重时,在配置了slow_start的情况下,该服务的权重是从0在配置的时间内慢慢增长到所配置的权重,该配置目前是在商业版本的nginx中生效
slow_start不适用hash和random load balancing
上游服务器只有一台的情况下,该参数也无效
如下配置则表示hdh100:9003这个服务,在启动后的60s内权重是从0慢慢提升到5。
1#上游服务器配置,给hdh100:9003配置了权重5和slow_start 60s,则在集群启动后该服务器的权重是在60s的时间内慢慢从0变为5
2upstream www.learn.com{
3 server hdh100:9001 weight=1;
4 server hdh100:9002 weight=3;
5 server hdh100:9003 weight=5 slow_start=60s;
6}
down和backup
down是将标记的服务器移除当前的服务器集群,被标记的服务器不会被访问到。
backup表示的是备用的意思,即在其他服务器可以提供服务的时候被backup标记的服务器不会被访问到,当其他服务器都挂掉后,backup标记的服务开始提供服务。
1#down配置示例,如下配置,则hdh100:9001这台服务器是不能提供服务的,不会被分配流量
2upstream www.learn.com{
3 server hdh100:9001 down;
4 server hdh100:9002;
5 server hdh100:9003;
6}
7
8#backup配置示例,如下配置,在hdh100:9002和hdh100:9003正常服务的时候,hdh100:9001不会提供服务,仅当另外两台服务都挂掉后,hdh100:9001开始提供服务
9upstream www.learn.com{
10 server hdh100:9001 backup;
11 server hdh100:9002;
12 server hdh100:9003;
13}
max_fails和fail_timeout
max_fails是一个验证服务器是否能提供正常服务的校验,需结合fail_timeout使用,表示在一定时间段内请求当前服务失败的次数超过该值时,则认为该服务宕机失败掉,就将该服务剔除上游服务器集群,不再给其分配访问流量。
fail_timeout表示失败服务的重试时间,即当该服务器被认为宕机失败时,间隔指定时间后再来重新尝试请求,如果仍请求失败则继续间隔指定时间再尝试请求,一直重复这种行为
1#如下是示例配置,表示在30s的时间内请求hdh100:9001的失败次数超过10次时,则认为hdh100:9001服务宕机,则随后的30s内该服务器不再被分配请求,30s后会重新尝试请求该服务器,若仍然请求失败,则重复上述行为
2upstream www.learn.com{
3 server hdh100:9001 max_fails=10 fail_timeout=30s;
4 server hdh100:9002;
5 server hdh100:9003;
6}
keepalive
设置nginx和上游服务器直接保持的长连接数量,目的是为了减少创建连接和关闭连接的损耗
1#如下示例,设置保持的长连接数量为32
2upstream www.learn.com{
3 server hdh100:9001 max_fails=10 fail_timeout=30s;
4 server hdh100:9002;
5 server hdh100:9003;
6
7 keepalive 32
8}
9
10#设置http版本为1.1,默认是http1.0版本是短连接
11#设置Connection header为空
12server {
13 listen 80;
14 server_name www.learn.com;
15
16 location / {
17 proxy_pass http://www.learn.com;
18 proxy_http_version 1.1;
19 proxy_set_header Connection "";
20 }
21}
3、缓存配置
nginx缓存
浏览器中的缓存加快单个用户浏览器的访问的速度,缓存是存在浏览器本地。
1location / {
2 root html;
3 index index.html;
4
5 #设置缓存过期时间为10s
6 # expires 10s;
7 #设置具体到期时间,如下示例代表缓存过期时间为晚上10点30分时
8 # expires @22h30m;
9 #设置过期时间为现在的前一个小时,则代表不使用缓存
10 # expires -1h;
11 #设置不使用缓存
12 # expires epoch;
13 # nginx关闭expires,则缓存机制是根据浏览器而定的
14 # expires off;
15 #设置缓存过期时间最大
16 # expires max;
17 }
nginx反向代理缓存
反向代理缓存是将,要代理的上游服务器的数据缓存在nginx端,目的是为了提升访问nginx端的用户的访问速度
1#proxy_cache_path 设置存储存储目录
2#keys_zone 设置名称以及共享内存大小
3#max_size 设置缓存大小
4#inactive设置缓存过期时间,超过该时间则被清理
5#use_temp_path设置是否使用临时目录,默认是使用,在这里设置关闭
6proxy_cache_path /home/local/cache keys_zone=learncache:5m max_size=2g inactive=60s use_temp_path=off;
7
8server {
9 listen 80;
10 server_name www.learn.com;
11
12 #开启缓存
13 proxy_cache learncache;
14 #对200和304状态的请求设置缓存过期时间
15 proxy_cache_valid 200 304 1h;
16
17 location / {
18 proxy_pass http://www.learn.com;
19 }
20}