高性能Nginx服务器(2)----负载均衡

location正则表达式

  • nginx的localtion的作用是匹配路径的地址

  • location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。

  • location的语法:

(1)以=开头表示精确的匹配
(2)=/ 表示/后面的路径地址不能带任何字符串,否则匹配不上
(3)^~开头表示uri以某个常规字符串开头,不是正则匹配
(4)开头表示区分大小写的正则匹配
(5)
*开头表示不区分大小写的正则匹配
(6)/ 通用匹配。如果没有其他的匹配,任何请求都会匹配到

  • 跨域问题

是由于域名或者端口号不同,浏览器的安全机制让其不能访问。但内部通信不存在跨域问题。这时候 可以使用nginx进行访问,我们使用同一个域名同一个端口号搭建nginx网关进行访问,都访问同一个nginx,只不过location配置不同,根据不同的请求,利用nginx跳转到不同的server服务器上
如:

1server { 2 listen 80; 3 server_name www.itmayiedu.com; 4 location /tomcat01/ { 5 # 这是一个IP地址(因为方便就没有配多个) 6 proxy_pass http://127.0.0.1:8080; 7 index index.html index.htm; 8 } 9} 10 11server { 12 listen 80; 13 server_name www.itmayiedu.com; 14 location /tomcat02/ { 15 # 这是另一个ip地址(应该和第一个不同,太麻烦所以没有配置) 16 proxy_pass http://127.0.0.1:8080; 17 index index.html index.htm; 18 } 19 } 20 21 22

注意:这里localtion /tomcat01/ 一定要在结束的时候加上/

  • nginx可以做网关的作用,但如果同时有nginx和网关的话,nginx主要做的是反向代理,网关的作用是权限控制(黑名单,白名单,负载均衡等)

在这里插入图片描述

负载均衡的作用

  • 负载均衡,建立在现有的网络结构之上,他提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽,增加吞吐量,加强网络数据处理能力,提高网络的灵活性和可用性。
  • 负载均衡,Load Balance,其意思就是分摊到多个操作单元上执行,例如web服务器,FTP服务器,企业关键应用服务器和其他的关键人物服务器等,从而共同完成工作任务。
  • 负载均衡就是,将所有的请求先到负载均衡器中,再由负载均衡器采用负载均衡算法(轮训,IP绑定,权重等策略)分发到不同实际的服务器中,这也就是服务器集群,集群的目的就是减轻单台服务器的压力

在这里插入图片描述
由上图:
(1)我们的请求是先到了LVS层,LVS会虚拟一个IP出来,再由LVS将请求发给nginx代理服务器
(2)LVS在传输层进行了负载均衡,Nginx在应用层做了负载均衡
(3)客户端先到LVS,再到Nginx,再由Nginx作为代理服务器,请求真实的服务器

负载均衡的缺点

  • 使用负载均衡之后,实际用到的服务器会被集群多台,那么这个时候就会产生分布式的很多问题。比如:

(1)分布式session一致性
(2)分布式定时任务调度幂等性
(3)分布式全局生成ID
(4)分布式锁
…等等,一堆分布式问题

网络模型图

在这里插入图片描述

  • 我们用的socket技术就是传输层的

四层和七层负载均衡的区别

  • 负载均衡器分为四层负载均衡器和七层负载均衡器
  • 四层负载均衡(就是说是网络的第四层,即传输层),在网络模型中的

传输层中,主要 基于TCP协议报文实现负载均衡(比如,LVS,F5(硬件负载均衡器),haproxy就是四层负载均衡器),使用改写报文源地址和目的地址方式

  • 七层负载均衡(网络模型的第七层,即应用层),在网络模型中的

应用层中,基于 URL或者HTTP协议实现负载均衡,一般是针对web服务实现负载均衡的

  • nginx目前是支持四层负载均衡和七层负载均衡的,1.9之后才开始支持4层负载均衡的。

upstream Server负载均衡

  • upstream server翻译过来就是上游服务器,意思就是负载均衡服务器设置,就是说是真实访问的服务器
  • 负载均衡算法:配置多个上游服务器(真实业务逻辑访问的服务器)的负载均衡机制
  • 失败重试机制:当上游服务器(真实业务逻辑访问的服务器)出现超时或者服务器不存活的时候,是否考虑重试机制补偿
  • 服务器心跳检测:当上游服务器(真实业务逻辑访问的服务器)监控检测,心跳检测。有TCP和HTTP协议两种。

不建议使用重试机制和心跳检测,重试机制可能发生重复问题,不保证幂等性;心跳检测一般由keepalive做,不由nginx实现。

Nginx配置负载均衡

  • Nginx负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡,故障转移,失败重试,容错,健康检查等。当上游服务器发生故障的时候(就是真实业务逻辑访问的服务器发生故障的时候),可以转移到其他上游服务器(其他的真实服务器)

upstream Server配置

  • upstream Server的主要配置是:IP地址和端口号(配置上游服务器的IP地址和端口号)

1 ###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制 2 upstream backServer{ 3 server 127.0.0.1:8080; 4 server 127.0.0.1:8081; 5 } 6 7 server { 8 listen 80; 9 server_name www.itmayiedu.com; 10 location / { 11 ### 指定上游服务器负载均衡服务器 12 proxy_pass http://backServer; 13 index index.html index.htm; 14 } 15 } 16 17 18
  • 默认采用的是轮训的机制,server端的访问变为

proxy_pass http://upstream的名字

负载均衡算法

  1. 轮训(默认)
  • 每一个请求按照时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户的访问不受影响,服务器的配置相差不多的时候使用轮训机制
  1. weight(轮训权值)
  • weight的值越大分配到该服务器上的概率就越大,主要用于后端每台服务器性能不均衡的情况下,或者仅仅为在主从的情况下设置不同的权值,达到合理有效的利用主机资源。
  1. ip_hash
  • 每个请求按照访问ip的哈希结果分配。使来自同一个IP的访客固定访问一台后端服务器。并且可以有效的解决动态网页存在session共享的问题。

也叫作IP绑定

  1. fair
  • 比weight,ip_hash更加智能的负载均衡算法,fair算法可以根据页面的大小和加载的时间长短,智能的进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果要使用这个,必须安装upstream_fair模块
  1. url_hash(第三方)
  • 按照访问的URL的哈希结果来分配请求,使每一个URL定向到一台后端服务器,可以进一步的提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要用,需要安装Nginx的hash包

  • 举例说明:

(1)轮询,因为默认就是,我们无需加其他配置

1 ###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制 2 upstream backServer{ 3 server 127.0.0.1:8080; 4 server 127.0.0.1:8081; 5 } 6 7 server { 8 listen 80; 9 server_name www.itmayiedu.com; 10 location / { 11 ### 指定上游服务器负载均衡服务器 12 proxy_pass http://backServer; 13 index index.html index.htm; 14 } 15 } 16 17 18

(2)权重(weight)

1 upstream backServer{ 2 server 127.0.0.1:8080 weight=1; 3 server 127.0.0.1:8081 weight=2; 4 } 5 6 server { 7 listen 80; 8 server_name www.itmayiedu.com; 9 location / { 10 ### 指定上游服务器负载均衡服务器 11 proxy_pass http://backServer; 12 index index.html index.htm; 13 } 14 } 15 16 17

(2)绑定IP(ip_hash)

1upstream backServer{ 2 server 127.0.0.1:8080 ; 3 server 127.0.0.1:8081 ; 4 ip_hash; 5 } 6 7 server { 8 listen 80; 9 server_name www.itmayiedu.com; 10 location / { 11 ### 指定上游服务器负载均衡服务器 12 proxy_pass http://backServer; 13 index index.html index.htm; 14 } 15 } 16 17 18

故障转移

  • Nginx在反向代理转发到真实服务器的时候(上游服务器),如果上游服务器(真实服务器)出现了down机或者有延迟超时的情况下,直接轮询下一台,轮询下一个节点(轮询的原因是配置的是轮询机制),不会再走已经down的真实服务器

  • Nginx配置故障转移:

1server { 2 listen 80; 3 server_name www.itmayiedu.com; 4 location / { 5 ### 指定上游服务器负载均衡服务器 6 proxy_pass http://backServer; 7 ### nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间 8 proxy_connect_timeout 1s; 9 ### nginx发送给上游服务器(真实访问的服务器)超时时间 10 proxy_send_timeout 1s; 11 ### nginx接受上游服务器(真实访问的服务器)超时时间 12 proxy_read_timeout 1s; 13 index index.html index.htm; 14 } 15 } 16 17 18

代码交流 2021