vlambda博客
学习文章列表

需要学会的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}