1 -【 高性能 Nginx 服务器 】- 7 负载均衡

1 负载均衡的作用

解决高并发问题

负载均衡:建立在现有网络结构之上,它提供了一种廉价有效透明的方法 扩展网络设备服务器的带宽增加吞吐量加强网络数据处理能力提高网络的灵活性和可用性

负载均衡,英文名称为 Load Balance,其意思就是分摊到多个操作单元上进行执行,例如:Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

负载均衡就是,将所有请求先到负载均衡器,在由负载均衡器采用负载均衡算法(轮询IP绑定权重)分发到不同实际的服务器中,这也就是服务器集群,集群的目的 是为了减轻单台服务器压力。

在这里插入图片描述

2 网络模型图

OSI中的层 功能 TCP/IP协议族
应用层 文件传输、电子邮件、文件服务、虚拟终端 TFTP、HTTP、SNMP、FTP、SMTP、DNS、RIP、Telnet
表示层 数据格式化、代码转换、数据加密 没有协议
会话层 解除或建立与别的接点的联系 没有协议
传输层 提供端对端的接口 TCPUDP
网络层 为数据包选择路由 IP、ICMP、OSPF、BGP、IGMP、ARP、RARP
数据链路层 传输有地址的帧以及错误检测功能 SLIP、CSLIP、PPP、MTU、ARP、RARP
物理层 以二进制数据形式再物理媒体上传输数据 ISO2110、IEEE802、IEEE802.2

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

四层负载均衡:在网络模型中的 传输层 中,基于主要是基于 TCP 协议报文实现负载均衡(比如 LVShaproxy 就是四层负载均衡器),使用改写报文的源地址和目的地址。

七层负载均衡:在网络模型中 应用层 中,基于 URL 或者 HTTP 协议实现负载均衡,Web服务器。

Nginx 在 1.9 之后,也支持 四层负载均衡

4 负载均衡的缺点

使用负载均衡后,实际用到的服务器是集群,那么这时候就会产生很多分布式相关问题。

比如:

  • 分布式 Session 一致性问题
  • 分布式定时任务调度 幂等性 问题
  • 分布式生成 全局 ID
  • 分布式锁 解决方案
  • 分布式配置中心

5 Nginx 配置负载均衡

Nginx 负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡故障转移失败重试容错健康检查 等。

当上游服务器(真实业务逻辑访问的服务器)发生故障时,可以转移到其他上游服务器(真实业务逻辑访问的服务器)。

最好不要使用 Nginx 的 失败重试 机制,会产生幂等性问题,微服务有重试机制。

5.1 Upstream Server 负载均衡

上游服务器:使用 负载均衡器 转发到真实的业务服务器

Upstream Server 中文翻译 上游服务器,意思就是负载均衡服务器设置,白话文表示(就是被 nginx 代理最后真实访问的服务器)。

负载均衡算法:配置多个上游服务器(真实业务逻辑访问的服务器)的负载均衡机制。

失败重试机制:当上游服务器(真实业务逻辑访问的服务器)出现超时或者服务器不存活,是否考虑重试机制(补偿机制)。

服务器心跳检测:当上游服务器(真实业务逻辑访问的服务器),监控检测|心跳检测。

5.2 Upstream Server 配置

###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮询机制
upstream test{
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
}

server {
    listen       80;
    server_name  www.test.com;
	
    location / {
        proxy_pass http://test;
        index  index.html index.htm;
    }

}

刷新 Nginx:

/usr/local/nginx/sbin/nginx -s reload

测试:
在这里插入图片描述
在这里插入图片描述

6 负载均衡算法

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

2、weight(轮询权值)

weight 的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

3、ip_hash

每个请求按访问 IP 的哈希结果分配,使来自同一个 IP 的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的 session 共享问题。俗称 IP 绑定。

4、fair(第三方)

weightip_hash 更加智能的负载均衡算法,fair 算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx 本身不支持 fair,如果需要这种调度算法,则必须安装 upstream_fair 模块。

5、url_hash(第三方)

按访问的 URL 的哈希结果来分配请求,使每个 URL 定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身不支持 url_hash,如果需要这种调度算法,则必须安装 Nginxhash 软件包。

6.1 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

6.2 权重 Weight

可以根据服务器的实际情况调整服务器权重。权重越高分配的请求越多,权重越低,请求越少。默认是都是1。

###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮询机制
upstream test{
    server 127.0.0.1:8001 weight=1;
    server 127.0.0.1:8002 weight=2;
}

server {
    listen       80;
    server_name  www.test.com;
	
    location / {
        proxy_pass http://test;
        index  index.html index.htm;
    }

}

6.3 IP 绑定 ip_hash

每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且 可以有效解决动态网页存在的 session 共享问题。俗称IP绑定。

###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮询机制
upstream test{
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    ip_hash;
}

server {
    listen       80;
    server_name  www.test.com;
	
    location / {
        proxy_pass http://test;
        index  index.html index.htm;
    }

}

7 Nginx 配置故障转移

当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。

Nginx 配置代码:

###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮询机制
upstream test{
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
}

server {
    listen       80;
    server_name  www.test.com;
    location / {
        ### 指定上游服务器负载均衡服务器
        proxy_pass http://test;
        ### nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
        proxy_connect_timeout 1s;
        ### nginx发送给上游服务器(真实访问的服务器)超时时间
        proxy_send_timeout 1s;
        ### nginx接受上游服务器(真实访问的服务器)超时时间
        proxy_read_timeout 1s;
        index  index.html index.htm;
    }
}

8 Nginx rewrite

Nginx 提供的全局变量或自己设置的变量,结合正则表达式和标志位实现 url 重写以及重定向。rewrite 只能放在 server{}location{}if{} 中,并且只能对域名后边的除去传递的参数外的字符串起作用。

Rewrite 主要的功能就是实现 URL 的重写,NginxRewrite 规则采用 Pcreperl 兼容正则表达式的语法规则匹配,如果需要 NginxRewrite 功能,在编译 Nginx 之前,需要编译安装 PCRE 库。

通过 Rewrite 规则,可以实现规范的 URL、根据变量来做 URL 转向及选择配置。

8.1 Rewrite 全局变量

nginx 的 rewrite 规则就是使用正则匹配请求的 url,然后根据定义的规则进行重写和改变,需 ngx_http_rewrite_module 模块来支持 url 重写功能,该模块是标准模块,默认已经安装。

变量 含义
$args 这个变量等于请求行中的参数,同 $query_string
$content length 请求头中的 Content-length 字段
$content_type 请求头中的 Content-Type 字段
$document_root 当前请求在root指令中指定的值
$host 请求主机头字段,否则为服务器名称
$http_user_agent 客户端 agent 信息
$http_cookie 客户端 cookie 信息
$limit_rate 这个变量可以限制连接速
$request_method 客户端请求的动作,通常为 GETPOST
$remote_addr 客户端的 IP 地址
$remote_port 客户端的端口
$remote_user 已经经过 Auth Basic Module 验证的用户名
$request_filename 当前请求的文件路径,由root或alias指令与URI请求生成
$scheme HTTP 方法(如 httphttps
$server_protocol 请求使用的协议,通常是HTTP/1.0HTTP/1.1
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值
$server_name 服务器名称
$server_port 请求到达服务器的端口号
$request_uri 包含请求参数的原始 URI,不包含主机名,如 /foo/bar.php?arg=baz
$uri 不带请求参数的当前 URI$uri 不包含主机名,如 /foo/bar.html
$document_uri $uri 相同

8.2 判断 IP 地址来源

## 如果访问的ip地址为192.168.5.165,则返回403
if  ($remote_addr = 192.168.5.166) {  
    return 403;  
}  

8.3 限制浏览器访问

## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
if ($http_user_agent ~ Chrome) {   
    return 500;  
}
发布了675 篇原创文章 · 获赞 214 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/weixin_42112635/article/details/104950900