草庐IT

代理和负载均衡概述

拉夫德鲁 2023-03-28 原文

带着问题阅读

1、什么是代理,代理有什么好处

2、正向代理和负向代理有什么区别

3、反向代理和负载均衡有什么关系

4、四层负载均衡和七层有什么区别

代理

代理,通俗来说好比是中介的角色,比如在生活中我们处理法律问题、房产交易都会请专业人士代为处理。从网络角度讲,就是为事务参与双方提供连接通道的第三方网络服务器。

在网络场景中,根据被代理的角色和作用划分,代理可分为正向代理和反向代理。

正向代理

正向代理是指对客户端提供的代理服务,在客户端无法直接访问服务端的情况下,通过配置代理服务器的方式访问服务端。

在整个过程中,客户端请求首先发送到代理服务器,代理服务器再将请求发送到服务端后将结果返回给客户端。从服务端角度来看,认为代理服务器才客户端,因此正向代理即代理客户端与服务端进行交互。比如生活中我们通过代购去购买海外商品,代购就是我们的正向代理。

正向代理通常有以下应用场景:

  • 提供网络通道:解决客户端由于防火墙或网络限制无法访问服务端的问题,如访问google等国外网站。
  • 隐藏客户端身份:服务端只感知代理服务器,无法获取真实客户端,如黑客控制肉鸡。

反向代理

反向代理是指对服务端提供的代理服务,通常出于安全考虑,真正的服务端只有内网网络,无法直接提供对外服务,为此需要设置反向代理服务器,由代理服务器接收外网请求,然后再转发到内部服务器。从客户端角度看,代理服务器是提供服务的服务端,因此反向代理即代理服务端与客户端交互。比如租房遇到的二房东,我们签合同也是与二房东签订,但实际提供住房的是房主。

反向代理通常有以下应用:

  • 提供对外服务:代理服务器暴露公网地址,接收请求并转发到内网服务器。
  • 负载均衡:根据预设策略将请求分发到多台服务器。
  • 提供安全保障:作为服务端防火墙,避免服务端遭受网络攻击。
  • 提高访问速度:基于网络位置设置就近代理服务器,提高资源获取速度,如CDN服务器。

区别

  • 正向代理代理客户端,服务端认为请求来自代理服务器;反向代理代理服务端,客户端认为提供服务的是代理服务器。
  • 正向代理通常由客户端架设,与客户端同处一个局域网;反向代理由服务端架设,与服务端同处一个局域网。
  • 正向代理通常解决访问限制的问题,反向代理通常解决对外服务和负载均衡的问题。

负载均衡

负载均衡介绍

负载均衡是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。

负载均衡既有基于软件的实现方案,也有基于硬件的实现方案。在软件方案中,又主要有:

  • 基于DNS的负载均衡

    在DNS服务器中,可以为多个不同的地址配置相同的名字,最终查询这个名字的客户机将在解析这个名字时得到其中一个地址,所以这种代理方式是通过DNS服务中的随机名字解析域名和IP来实现负载均衡。

  • 反向代理负载均衡

    通常的反向代理技术,支持为同一服务配置多个后端服务器地址,以及设定相应的轮询策略。请求到达反向代理服务器后,代理通过既定的轮询策略转发请求到具体服务器,实现负载均衡,如Nginx的七层配置形式。

  • 基于NAT的负载均衡

    该技术通过一个地址转换网关将每个客户端连接转换为不同的内部服务器地址,因此客户端就各自与自己转换得到的地址上的服务器进行通信,从而达到负载均衡的目的,如LVS和Nginx的四层配置形式。

网络模型和负载均衡

参照OSI标准网络模型定义,负载均衡有二、三、四、七层四种负载均衡方式,对应到TCP网络模型中,即数据链路层负载均衡、网络层负载均衡、传输层负载均衡及应用层负载均衡,实际应用中通常采用四层负载均衡和七层负载均衡。

  • 四层负载均衡(IP+端口)

    四层负载均衡是IP+端口的实现,以TCP协议为例,四层负载只需解析TCP报文头部,按照负载均衡算法选择相应服务后端,将报文目的地址和端口修改为真实后端服务器地址和端口,并转发请求到对应后端服务器。因此在四层负载情况下,负载均衡起到类似路由转发的效果,TCP连接的建立是客户端和服务端直接建立的。

    四层负载常用软件有:

    • LVS(常用,稳定性最好)
    • Nginx(需要额外编译stream模块)
    • HaProxy
  • 七层负载均衡(应用层协议如HTTP)

    七层负载也称为内容交换,通常与具体应用层协议关联,根据客户端发送请求内容选择服务端进行负载转发,如Nginx基于请求URL配置转发。七层负载情况下,负载均衡与反向代理类似,客户端和服务端分别与负载均衡器建立连接,因此效率要低于四层负载。

    七层负载常用软件有:

    • HaProxy
    • Nginx
    • Apache(较少使用)

负载均衡和反向代理

负载均衡与反向代理是两个概念,由于其网络架构形式类似(都用于接入服务端),带来一定程度的混淆。

知乎:反向代理和负载均衡有何区别?

负载均衡的核心目标在于如何将请求均衡的分发到多个服务端;反向代理的核心目标在于隐藏服务端内部地址并为服务端提供外部访问方式。出于高可靠机制的考虑,反向代理通常也会为同一服务注册多个后端地址,因此如Nginx同时提供了反向代理和负载均衡的能力,这也是造成概念混淆的原因。

通常来讲经过反向代理,真实服务端对客户端不可见,代理即客户端认为的服务端。相较负载均衡,七层负载的请求转发与反向代理机制类似,而四层负载的NAT形式,是将报文目的地址修改为真实服务后端地址,与反向代理有根本区别。

参考

有关代理和负载均衡概述的更多相关文章

  1. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  2. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

  3. ruby-on-rails - capybara poltergeist - 覆盖用户代理 - 2

    有人知道如何将capybarapoltergeist的用户代理覆盖到移动用户代理以进行测试吗?我发现了一些有关为seleniumwebdriver配置它的信息:http://blog.plataformatec.com.br/2011/03/configuring-user-agents-with-capybara-selenium-webdriver/这在capybara闹鬼中怎么可能? 最佳答案 请参阅poltergeistgithub页面上的链接:https://github.com/teampoltergeist/polte

  4. ruby - 如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作? - 2

    我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe

  5. ruby - 如何捕获所有 HTTP 流量(本地代理) - 2

    我希望访问我机器上的所有HTTP流量(我的Windows机器-不是服务器)。据我了解,拥有一个本地代理是所有流量路线的必经之路。我一直在谷歌搜索但未能找到任何资源(关于Ruby)来帮助我。非常感谢任何提示或链接。 最佳答案 WEBrick中有一个HTTP代理(Rubystdlib的一部分)和here's一个实现示例。如果你喜欢生活在边缘,还有em-proxy伊利亚·格里戈里克。这postIlya暗示它似乎确实需要一些调整来解决您的问题。 关于ruby-如何捕获所有HTTP流量(本地代理)

  6. ruby-on-rails - 如何在 Ruby Net::FTP 中使用代理服务器? - 2

    我正在使用Net::FTPruby​​库连接到FTP服务器并下载文件。一切正常,但现在我需要使用出站代理,因为他们的防火墙将IP地址列入白名单,并且我正在使用Heroku来托管该站点。我正在试用新的Proximo附加组件,它看起来很有前途,但我无法让Net::FTP使用它。我在Net::FTPdocs中看到以下内容:connect(host,port=FTP_PORT)EstablishesanFTPconnectiontohost,optionallyoverridingthedefaultport.IftheenvironmentvariableSOCKS_SERVERisset,

  7. ruby - 如何在没有用户名和密码的情况下访问代理? - 2

    我想使用nokogiri和mechanize自动化一个计时网络客户端。我需要通过代理服务器连接,但问题是,我不知道所述代理服务器的用户名和密码。我想获取存储在计算机上的此代理的缓存凭据..例如,在c#中你可以使用:stringproxyUri=proxy.GetProxy(requests.RequestUri).ToString();requests.UseDefaultCredentials=true;requests.Proxy=newWebProxy(proxyUri,false);requests.Proxy.Credentials=System.Net.Credential

  8. ruby-on-rails - EC2 实例在负载均衡器中停止服务 - 2

    我有一个EC2实例正在运行。我有一个负载均衡器,它与EC2实例相关联。PingTarget:HTTP:3001/healthCheckTimeout:5secondsInterval:24secondsUnhealthythreshold:2Healthythreshold:10现在该实例显示为OutofService。我什至尝试更改监听端口等等。一切正常,直到重新启动我的EC2实例。任何帮助将不胜感激。仅供引用:我有一个在端口3001上运行的Rails应用程序,我有一个用于HTTP:80(loadbalancer)到HTTP:3001的监听器。我还在终端中通过ssh检查了正在运行的应

  9. ruby - 如何在 Ruby 中编写一个简单的 HTTPS 代理服务器? - 2

    我看过几个用Ruby编写HTTP代理的例子,例如thisgistbyTorstenBecker,但我如何扩展它来处理HTTPS,又名“中间人”SSL代理?我正在寻找一个简单的源代码框架,我可以扩展它以满足我自己的日志记录和测试需求。更新我已经在使用Charles,aniftyHTTPSproxyapp类似于Fiddler,它本质上是我想要的,只是它被打包在一个应用程序中。我想自己写一个,因为我对过滤和展示有特定的需求。更新二四处浏览后,我对术语的理解有所好转。我不是在寻找完整的“中间人”SSL代理。相反,它将在我的机器上本地运行,因此我可以接受它提供的任何SSL证书。但是,我需要查看我

  10. ruby - 带代理的 HTTParty - 2

    我在heroku上试图访问一个需要将我的应用程序ip列入白名单的API。因此,我使用heroku附加组件proximo获取api白名单的主机/ip。我设置的使用HTTParty测试连接性的快速测试失败了。classFakeRequestincludeHTTPartyhttp_proxy'XX.XXX.XX.XX',80,'user','pass'defset_defaults{:api_key=>"BLARG_BLARG",:login_name=>"user",:method=>"do_something",:response_format=>"json",:v=>"1.0",:lo

随机推荐