nginx实现反向代理及负载均衡

一、反向代理

1.什么是反向代理

通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务器向Internet上的web服务器发起请求,最终达到客户机上网的目的(也就是正向代理)。

而反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

如下图:

Nginx只做请求的转发,后台有多个http服务器提供服务,nginx的功能就是把请求转发给后面的服务器,决定把请求转发给谁。

二、负载均衡

1、什么是负载均衡?

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

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

Nginx 负载均衡是由代理模块和上游(upstream)模块共同实现的,Nginx 通过代理模块的反向代理功能将用户请求转发到上游服务器组,上游模块通过指定的负载均衡策略及相关的参数配置将用户请求转发到目标服务器上。上游模块可以与 Nginx 的代理指令(proxy_pass)、FastCGI 协议指令(fastcgi_pass)、uWSGI 协议指令(uwsgi_pass)、SCGI 协议指令(scgi_pass)、memcached 指令(memcached_pass)及 gRPC 协议指令(grpc_pass)实现多种协议后端服务器的负载均衡。

Nginx 支持多种负载均衡策略,如轮询(Round Robin)、一致性哈希(Consistent Hash)、IP 哈希(IP Hash)、最少连接(least_conn)等。Nginx 的默认负载均衡策略为轮询策略,不需要配置指令,轮询策略通过 server 的权重参数可实现手动分配的加权轮询策略。

负载均衡技术是将大量的客户端请求通过特定的策略分配到集群中的节点,实现快速响应的应用技术。在应对高并发的应用请求时,单节点的应用服务计算能力有限,无法满足客户端的响应需求,通过负载均衡技术,可以将请求分配到集群中的多个节点中,让多个节点分担高并发请求的运算,快速完成客户端的请求响应。

1、轮询

轮询(Round Robin)策略是 Nginx 配置中默认的负载均衡策略,该策略将客户端的请求依次分配给后端的服务器节点,对后端集群中的服务器实现轮流分配。轮询策略绝对均衡,且实现简单,但也会因后端服务器处理能力的不同而影响整个集群的处理性能。

1) 加权轮询

在 Nginx 的轮询策略中,为了避免因集群中服务器性能的差异对整个集群性能造成影响,在轮询策略的基础上增加了权重参数,让使用者可以手动根据集群中各服务器的性能将请求数量按照权重比例分配给不同的被代理服务器。

2) 平滑轮询

在加权轮询策略中,会按照权重的高低分配客户端请求,若按照高权重分配完再进行低权重分配的话,可能会出现的情况是高权重的服务器一直处于繁忙状态,压力相对集中。Nginx 通过平滑轮询算法,使得上游服务器组中的每台服务器在总权重比例分配不变的情况下,均能参与客户端请求的处理,有效避免了在一段时间内集中将请求都分配给高权重服务器的情况发生。

2、一致性哈希

Nginx 启用哈希的负载均衡策略,是用 hash 指令来设置的。哈希策略方法可以针对客户端访问的 URL 计算哈希值,对相同的 URL 请求,Nginx 可以因相同的哈希值而将其分配到同一后端服务器。当后端服务器为缓存服务器时,将极大提高命中率,提升访问速度。
一致性哈希的优点是,可以使不同客户端的相似请求发送给同一被代理服务器,当被代理服务器为缓存服务器场景应用时,可以极大提高缓存的命中率。
一致性哈希的缺点是,当上游服务器组中的节点数量发生变化时,将导致所有绑定被代理服务器的哈希值重新计算,影响整个集群的绑定关系,产生大量回源请求。

配置样例中 Nginx 一致性哈希策略计算过程如下。

首先根据 $request_uri 计算哈希值;

通过二分法,快速在虚拟节点列表中选出该哈希值所在范围的最大虚拟节点哈希值;

通过虚拟节点哈希值与虚拟节点集合总数取余,获得对应的服务器作为备选服务器;

遍历轮询策略中被代理服务器列表,判断备选服务器的有效性,选出服务器;

若循环 20 次仍无法选出,则使用轮询策略进行选择。

3、IP 哈希

IP 哈希(IP Hash)负载均衡策略根据客户端IP计算出哈希值,然后把请求分配给该数值对应的被代理服务器。在哈希值不变且被代理服务器可用的前提下,同一客户端的请求始终会被分配到同一台被代理服务器上。IP 哈希负载均衡策略常被应用在会话(Session)保持的场景。
HTTP 客户端在与服务端交互时,因为 HTTP 协议是无状态的,所以任何需要上下文逻辑的情景都必须使用会话保持机制,会话保持机制是通过客户端存储由唯一的 Session ID 进行标识的会话信息,每次与服务器交互时都会将会话信息提交给服务端,服务端依照会话信息实现客户端请求上下文的逻辑关联。
会话信息通常存储在被代理服务器的内存中,如果负载均衡将客户端的会话请求分配给其他被代理服务器,则该会话逻辑将因为会话信息失效而中断。所以为确保会话不中断,需要负载均衡将同一客户端的会话请求始终都发送到同一台被代理服务器,通过会话保持实现会话信息的有效传递。

配置样例中 Nginx 的 IP 哈希策略计算过程如下:

在多层代理的场景下,请确保当前 Nginx 可获得真实的客户端源 IP;

首先会根据客户端的 IPv4 地址的前三个八位字节或整个 IPv6 地址作为哈希键计算哈希值;

根据哈希值与配置文件中非备份状态服务器的总权重计算出哈希余数;

按照轮询策略选出初始被代理服务器,如果哈希余数大于初始被代理服务器的权重,则遍历轮询策略中被代理服务器列表,否则初始被代理服务器将被选出;

当遍历轮询策略中被代理服务器列表时,要用哈希余数依次减去轮询策略中的上一个被代理服务器的权重,直到哈希余数小于某个被代理服务器的权重时该被代理服务器被选出;

若循环 20 次仍无法选出,则使用轮询策略进行选择。

4、最少连接

默认配置下轮询算法是把客户端的请求平均分配给每个被代理服务器,每个被代理服务器的负载大致相同,该场景有个前提就是每个被代理服务器的请求处理能力是相当的。如果集群中某个服务器处理请求的时间比较长,那么该服务器的负载也相对增高。在最少连接(least_conn)负载均衡策略下,会在上游服务器组中各服务器权重的前提下将客户端请求分配给活跃连接最少的被代理服务器,进而有效提高处理性能高的被代理服务器的使用率。

配置样例中 Nginx 最少连接策略计算过程如下:

遍历轮询策略中被代理服务器列表,比较各个后端的活跃连接数(conns)与其权重(weight)的比值,选取比值最小者分配客户端请求;

如果上一次选择了 a 服务器,则当前请求将在 b 和 c 服务器中选择;

设 b 的活跃连接数为 100,c 的活跃连接数为 60,则 b 的比值(conns/weight)为 50,c 的比值(conns/weight)为 60,因此当前请求将分配给 b。

5、随机负载算法

在 Nginx 集群环境下,每个 Nginx 均通过自身对上游服务器的了解情况进行负载均衡处理,这种场景下,很容易出现多台 Nginx 同时把请求都分配给同一台被代理服务器的场景,该场景被称为羊群行为(Herd Behavior)。

Nginx 基于两种选择的力量(Power of Two Choices)原理,设计了随机(Random)负载算法。该算法使 Nginx 不再基于片面的情况了解使用固有的负载均衡策略进行被代理服务器的选择,而是随机选择两个,在经过比较后进行最终的选择。随机负载算法提供了一个参数 two,当这个参数被指定时,Nginx 会在考虑权重的前提下,随机选择两台服务器,然后用以下几种方法选择一个服务器。

最少连接数,配置指令为 least_conn,默认配置;

响应头最短平均时间,配置指令为 least_time=header,仅对商业版本有效;

完整请求最短平均时间,配置指令为 least_time=last_byte,仅对商业版本有效。

Nginx反向代理服务器解决负责均衡问题相关推荐

  1. Nginx反向代理服务器及负载均衡服务配置实战

    Nginx反向代理服务器及负载均衡服务配置实战 1 前言:什么是Nginx? Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服 ...

  2. Mac下使用nginx反向代理服务器解决资源跨域问题

    使用homebrew来安装nginx,打开终端 1.  安装homebrew包 ruby -e "$(curl-fsSL https://raw.githubusercontent.com/ ...

  3. Nginx反向代理服务器获取不到端口的问题的解决办法

    Nginx反向代理服务器获取不到端口的问题的解决办法 参考文章: (1)Nginx反向代理服务器获取不到端口的问题的解决办法 (2)https://www.cnblogs.com/Leslieblog ...

  4. 从0开始,在Linux中配置Nginx反向代理、负载均衡、session共享、动静分离

    写这篇文章花费了我近一周的时间,参考网上许多优秀的博客文章,我不敢说写的很好,至少很全很详细.本文先介绍原理部分,然后再进行实战操作,我认为这样才会有更深的理解,不过这也导致了文章篇幅很长.但是,如果 ...

  5. nginx反向代理,负载均衡

    nginx 反向代理(Reverse Proxy)是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户 ...

  6. Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    本站点停止更新,请访问:blog.coocap.com 相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tom ...

  7. 【转】Nginx反向代理和负载均衡

    原文链接:http://www.cnblogs.com/shuoer/p/7820899.html Nginx反向代理和负载均衡 环境说明 由于我使用的是windows系统,所以我用虚拟机虚拟出来了3 ...

  8. nginx ------反向代理和负载均衡

    nginx ------反向代理和负载均衡 最近由于公司的业务增长 服务器承受不住压力经常出现崩溃现象 为了解决 使用nginx的负载均衡解决,以下是操作步骤: 1.nginx 的负载均衡:将压力分散 ...

  9. Nginx反向代理与负载均衡等配置文件示例

    Nginx反向代理于负载均衡等配置文件示例 Nginx.conf配置文件 worker_processes 8;events {worker_connections 1024; }http {incl ...

最新文章

  1. 家庭背景音乐的发展趋势
  2. Hadoop pipes编程
  3. 模拟三:STEMA 考试选择题模拟练习试卷(初级组)及答案 + 自我解题笔记
  4. stm32 PWM输出学习
  5. 如何将一个文件分割成多个小文件
  6. Win32多线程编程(1) — 基础概念篇
  7. jQuery——给元素添加父级的方法
  8. BZOJ 3925: [Zjoi2015]地震后的幻想乡(概率)
  9. Fiddler笔记一移动端连接
  10. ThinkPHP 3.2 DEMO案例系列【phpmailer批量发送邮件】
  11. 电子通信协议之SPI通信协议篇
  12. 河南高二计算机会考excel,(完整版)高中信息技术学业水平考试Word、Excel操作题考点总结...
  13. Linux性能监控命令_nmon 安装与使用
  14. 代谢组与转录组联合分析方法介绍
  15. AIS标准(ITU-R M.1371-5)和Python解码模块
  16. pdf转换成excel文件_将PDF文件转换为Excel
  17. linux系统浏览器最小化,调整Firefox火狐浏览器的最小化、最大化、关闭按钮键大小...
  18. Java OCR 图像智能字符识别技术[可识别中文]
  19. 孙祥:尊重别人是尊重自己 大牌印象最深是苏克
  20. OA办公系统选型标准知多少?

热门文章

  1. VMware ESXi添加NVMe硬盘扩容
  2. 数据链路层协议 ——— 以太网协议
  3. 创造与魔法怎么自建服务器,创造与魔法自建服攻略大全_创造与魔法自建服建造方法、福利_玩游戏网...
  4. ERP失败案例:业务流程再造失误
  5. “瓮中捉鳖”——涨停板一般出现在什么时候?
  6. Qt之实现图片轮播效果
  7. vue里面使用echarts实现根据浏览器屏幕大小自适应
  8. ChatGPT工作提效之初探路径独孤九剑遇强则强
  9. 前端vs图片:0 为什么需要重视图片
  10. [Android]之一:Android系统下载管理DownloadManager