nginx 反向代理及负载均衡策略_nginx反向代理的基本策略-程序员宅基地

技术标签: nginx  负载均衡  代理  反向代理  代理模式  # nginx  

正向代理:代理服务器对客户端的进行代理
反向代理:代理服务器对http服务器做代理

代理服务

先用社会生活中我们常见的场景解释一下代理:

租房代理 or 中介

很多有房人士想将自己闲置的房子出租,但是他们大部分都还有其它更赚钱的事情要忙,并且他们自己住的房子和闲置的房子也不在同一个地方。因此并不愿花时间接待并带领每一位想要看房子的租客到自己闲置的房子那里去看房,也不愿花时间对租客的各种问题做解答。

于是就出现了租房代理或者中介,他们专门负责带领租客看房子、解答租客的问题,虽然租客的主要目标即住房服务是房主提供的,但是其它诸如带看、解答问题等这些事情都是代理或者中介提供的。

代理与中介也有区别,代理一般只负责带看,租房合同一般还是租客与房东直接签,代理只从房东那里收取带看费用。
中介一般是先从房东手中将房子租下来,付给房东较低的租金。而以更高的租金将房子租给租客,租客是同中介签订租房合同。

产品代理商

工厂能生产产品,但是通常情况下,产品的使用者并不是从工厂厂家直接买到的产品,而是从一些或者商场、超市、小卖店或者购物平台上买到的产品。

虽然主要功能提供者——产品,是工厂生产的。但是售卖服务是商超或者网络平台提供的。

例如淘宝上一些店铺,有些店铺并不从工厂进货、也无需设立仓库,只是将商品信息挂在平台上,并负责解答有意向的购买者的一些问题,如果淘宝用户下单,其实产品还是从工厂直接发货的,只是售卖服务由店铺人员负责。

编程中的代理模式

借鉴代理服务这个概念,可以将代理模式理解为:通过代理服务,对原功能进行增强,提供更适合需求的服务。

代理模式通常用于要对很多不同的业务功能做相同的增强功能时,如面向切面的编程的应用场景:
日志功能:记录所有业务方法的调用、参数、执行时间等
权限功能:对所有请求做权限过滤、拦截,确保每个业务方法的调用是有权限的用户操作的。

Nginx服务器提供的正向代理与反向代理功能

正向代理

fanqiang访问一些国外网站即正向代理。

反向代理

Nginx服务器对多个http服务器做代理,客户端会对Nginx代理服务器发出请求,nginx再将请求转发到真正能处理请求的其中一台http服务器上,服务器处理完请求后将资源或者处理结果响应给nginx,nginx再将响应信息返回给客户端。

Nginx反向代理服务做了哪些增强

负载均衡

Nginx的负载均衡功能是指:当客户端请求量非常大时,nginx将请求相对均衡地转发到各个http服务器上,使得每个http服务器所处理的请求数量都和其它http服务器处理的请求量差不多。

均衡策略

  • 内置的策略有:轮询、加权轮询、IP hash,内置的策略被编译进了Nginx内核,使用时直接做相关的参数配置即可。
  • 扩展的策略:一些第三方模块提供了hash、fair等扩展策略,扩展的策略需要将第三方模块手动编译到Nginx内核。

轮询
假如有http服务器1-5,则nginx会将自己接到的第1个请求转发到服务器1,第2个请求转发到服务器2…第6个请求再转发到服务器1,第7个请求转发到服务器2…

加权轮询
在轮询策略的基础上,再结合用户为每个http服务器配置的处理请求的权重数据,做转发。以如下http服务器及权重数据为例:http服务器1 权重0.6; http服务器2 权重0.2 ; http服务器3 权重0.2;则nginx会将接到的第1-3请求均转发到服务器1,当接到第4个请求时会转发到服务器2,第5个请求转发给服务器3,第6-8个请求转发给服务器1 …

加权轮询适用于各个http服务器性能不均等的情况,例如轻中某个http服务器内存、CPU数目等都比其他http服务器大,则可以为其配置大的权重值。

IP hash
对发出请求的客户端的IP地址进行hash,然后根据hash值将请求散列到不同的http服务器上去。
**特点:**同一个客户端的所有请求都会被转发到同一个http服务器上去,可以避免考虑前端用户的session在后端多个节点上共享的问题。

url hash
对请求的url做hash,然后根据hash值散列转发到不同的http服务器上去。
特点所有客户端的url相同的请求都会被转发到同一个http服务器上去。如果有对某url请求的结果使用缓存,那么此策略能提高缓存性能,同时也能解决session问题。
缺点:如果某http服务器出现异常,nginx无法自动排除该节点。(通常情况下,nginx将一个请求转发到某http服务器后,如果服务器返回5xx,nginx会将请求再次转发,直到有正常服务的http服务器处理了这个请求,在此过程中,nginx会记录并排除掉不能正常提供服务的http服务器。)

fair
fair模块会将请求转发给最近负载最小的http服务器上去。负载大小是根据响应时间来判断的。

这种方式适用于有些请求的计算任务量非常大,而有些请求的计算任务量非常小的情况。

缓存

nginx提供了两种类型的缓存功能:

  • Proxy_cache相关指令集提供反向代理时,对http服务器返回的结果进行URL缓存
  • FastCGI_cache相关指令集提供fast cgi动态程序进行缓存。

清除缓存

常用的第三方模块ngx_cache_purge提供了清除指定的URL缓存的功能。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wenxindiaolong061/article/details/107506157

智能推荐

git 的基础命令使用-程序员宅基地

git的基本用法1、git的安装官网链接地址 https://git-scm.com/downloads点击下载下一步,就ok,成功安装之后window环境下,右击鼠标出现Git Gui和Git Bash,Gui是图形界面,Bash是linux命令行界面。使用bash即可。2、git的本地基本命令git clone 从远程代码仓库下载代码或文本信息到本地。git clone ..._git aaa.html

关于java执行cmd文件_java执行本地cmd 本地文件-程序员宅基地

在java中我用这种方式调用批处理(bat)文件String batFilePath = "cmd /c d:/workshop/set/startup_setdb.bat"; try{Process process = Runtime.getRuntime().exec(batFilePath);InputStream in = process.getInp_java执行本地cmd 本地文件

css各种手型集合(css禁止手型)_css手型-程序员宅基地

写这篇博客前不得不先吐槽下国内的技术性文章现状;1:在国内真心缺少技术性的文章;2:用百度搜技术性的文章真心不靠谱;好吧;正题;下面是在国外搜刮来的;比较齐全的鼠标手型css;在国内的网站上是搜不到这么全的;比如说哪个禁止的手型;鼠标往下移动即可看到效果;html代码如下:Cursors auto default none _css手型

Python - Kaggle实战篇1- 为什么选择Kaggle-程序员宅基地

为什么要选Kaggle?1 首先是因为钱。Kaggle经常有各种类型的竞赛,赢得比赛本身就会有奖金。没有钱搞科研是很困难的,也没什么动力。参加竞赛算是很理想的方法:1 技术强-> 拿钱2 拿了钱 -> 增加技术投资2 其模式可以称为一种行业标准举个例子,任何一个竞赛首先会有一些概要描述,本质上是商业应用的概述。提供了应用相关联的规整数据。提供了一些思路/教程(相当于参加竞赛的人的一个小社区)还有排行榜当然kaggle本身也提供了jupyter notebook给

程序员必知8大排序3大查找(二) .-程序员宅基地

6、快速排序 (1)基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。(2)实例:上图中将待排序列分成两部分,一部分比基准元素小,一部分大于基准元素,然后对这两部分重复上图的求解过程。(这

随便推点

Caffe多标签读入方式-使用Faster RCNN模式的读取方式,非常方便不用改源代码_faster rcnn caffe如何实现两个输入-程序员宅基地

https://blog.csdn.net/DaVinciL/article/details/81983670代码地址:https://github.com/rbgirshick/py-faster-rcnn解析文章地址:https://www.cnblogs.com/hotsnow/p/9906585.htmlhttps://blog.csdn.net/william..._faster rcnn caffe如何实现两个输入

总结|C语言实现的矩阵运算(svd分解、乘法、转置等)_c语言实现svd-程序员宅基地

文章目录前言C语言实现的矩阵运算汇总矩阵的定义头文件:matrix_operation.h函数实现:matrix_operation.c对于svd分解:svdcmp.hsvd分解实现: svdcmp.cdemo举例(实现类似Eigen中的svd分解功能)Eigen版本的实现如下:C版本的实现如下:前言这里总结下C++代码转C代码时,对于矩阵运算的C语言封装。在此申明,此处参考了网上的一些经验帖,以及增加了自己的一些封装与完善,仅供大家学术参考。如有不当之处,还请批评指正。C语言实现的矩阵运算汇总矩阵_c语言实现svd

json和obj转化工具类_json2obj-程序员宅基地

package com.aixuexi.xiuchun.test;import com.gaosi.api.xiuchun.model.ResearchDto;import java.io.IOException;import org.codehaus.jackson.map.ObjectMapper;import org.json.JSONException;import org...._json2obj

ZYNQ7010实现流水灯综合与烧录_zynq烧录_winkle_Zhang的博客-程序员宅基地

ZYNQ7010实现流水灯综合与烧录点击+号 ,选择第一个2. 点击create file-finish3.添加约束文件模板到XDC:Tools – Language templates – XDC – Physical Constraints – IO Constraints(7-series) – IOATNDARD 然后对管脚位置进行分配 Placement(7-series) – specific location – IO pin Assigment复制进XDC文件set_p_zynq烧录