ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

http学习 http的代理服务之反向代理

2022-02-09 16:35:06  阅读:117  来源: 互联网

标签:HTTP http 代理服务 IP 请求 代理 反向 服务器 客户端


代理服务

“代理”这个词听起来好像很神秘,有点“高大上”的感觉。

但其实 HTTP 协议里对它并没有什么特别的描述,它就是在客户端和服务器原本的通信链路中插入的一个中间环节,也是一台服务器,但提供的是“代理服务”。

所谓的“代理服务”就是指服务本身不生产内容,而是处于中间位置转发上下游的请求和响应,具有双重身份:面向下游的用户时,表现为服务器,代表源服务器响应客户端的请求;而面向上游的源服务器时,又表现为客户端,代表客户端发送请求。

 

 

代理的作用

你也许听过这样一句至理名言:“计算机科学领域里的任何问题,都可以通过引入一个中间层来解决”(在这句话后面还可以再加上一句“如果一个中间层解决不了问题,那就再加一个中间层”)。TCP/IP 协议栈是这样,而代理也是这样。

 

 

由于代理处在 HTTP 通信过程的中间位置,相应地就对上屏蔽了真实客户端,对下屏蔽了真实服务器,简单的说就是“欺上瞒下”。在这个中间层的“小天地”里就可以做很多的事情,为 HTTP 协议增加更多的灵活性,实现客户端和服务器的“双赢”。

代理具有如下作用:

  负载均衡:代理服务器可以掌握请求分发的“大权”,决定由后面的哪台服务器来响应请求。

健康检查:使用“心跳”等机制监控后端服务器,发现有故障就及时“踢出”集群,保证服务高可用;

安全防护:保护被代理的后端服务器,限制 IP 地址或流量,抵御网络攻击和过载;

加密卸载:对外网使用 SSL/TLS 加密通信认证,而在安全的内网不加密,消除加解密成本;

数据过滤:拦截上下行的数据,任意指定策略修改请求或者响应;

内容缓存:暂存、复用服务器响应

 

 

代理相关头字段

代理服务器需要用字段“Via”标明代理的身份。

Via 是一个通用字段,请求头或响应头里都可以出现。每当报文经过一个代理节点,代理服务器就会把自身的信息追加到字段的末尾。

如图:

 

 

Via 字段只解决了客户端和源服务器判断是否存在代理的问题,还不能知道对方的真实信息。因此出现以下不在http中但是成为事实上标准的字段:

 

X-Forwarded-For

  “X-Forwarded-For”的字面意思是“为谁而转发”,形式上和“Via”差不多,也是每经过一个代理节点就会在字段里追加一个信息。但“Via”追加的是代理主机名(或者域名),而“X-Forwarded-For”追加的是请求方的 IP 地址。所以,在字段里最左边的 IP 地址就是客户端的地址。

X-Real-IP

  “X-Real-IP”是另一种获取客户端真实 IP 的手段,它的作用很简单,就是记录客户端 IP 地址,没有中间的代理信息,相当于是“X-Forwarded-For”的简化版。如果客户端和源服务器之间只有一个代理,那么这两个字段的值就是相同的。 

X-Forwarded-Host

  记录客户端的信息,分别是客户端请求的原始域名。

X-Forwarded-Proto

  记录客户端的信息,客户端请求的原始协议名。

 

 

代理协议

The PROXY protocol,它由知名的代理软件 HAProxy 所定义,也是一个“事实标准”,被广泛采用(注意并不是 RFC)。

“代理协议”有 v1 和 v2 两个版本,v1 和 HTTP 差不多,也是明文,而 v2 是二进制格式。今天只介绍比较好理解的 v1,它在 HTTP 报文前增加了一行 ASCII 码文本,相当于又多了一个头。

这一行文本其实非常简单,开头必须是“PROXY”五个大写字母,然后是“TCP4”或者“TCP6”,表示客户端的 IP 地址类型,再后面是请求方地址、应答方地址、请求方端口号、应答方端口号,最后用一个回车换行(\r\n)结束。

例如下面的这个例子,在 GET 请求行前多出了 PROXY 信息行,客户端的真实 IP 地址是“1.1.1.1”,端口号是 55555。

PROXY TCP4 1.1.1.1 2.2.2.2 55555 80\r\n
GET / HTTP/1.1\r\n
Host: www.xxx.com\r\n
\r\n

服务器看到这样的报文,只要解析第一行就可以拿到客户端地址,不需要再去理会后面的 HTTP 数据,省了很多事情。

 

 

小结

  1. HTTP 代理就是客户端和服务器通信链路中的一个中间环节,为两端提供“代理服务”;
  2. 代理处于中间层,为 HTTP 处理增加了更多的灵活性,可以实现负载均衡、安全防护、数据过滤等功能;
  3. 代理服务器需要使用字段“Via”标记自己的身份,多个代理会形成一个列表;
  4. 如果想要知道客户端的真实 IP 地址,可以使用字段“X-Forwarded-For”和“X-Real-IP”;
  5. 专门的“代理协议”可以在不改动原始报文的情况下传递客户端的真实 IP。

 

 

问答

1、你觉得代理有什么缺点?实际应用时如何避免?

答:

  代理会增加链路长度,在代理上做一些复杂的处理。会很耗费性能,增加响应时间。

 

2、你知道多少反向代理中使用的负载均衡算法?它们有什么优缺点?

答:

  随机——简单,是否均匀看随机情况
  轮询(一般轮询、加权轮询)——相对简单,也会考虑机器资源和性能的均衡性
  哈希(一般哈希、一致性哈希、带虚拟节点的一致性哈希)——相对复杂,要求越公平就会越复杂,而且适当考虑了请求
  哈希槽,和redis类似

标签:HTTP,http,代理服务,IP,请求,代理,反向,服务器,客户端
来源: https://www.cnblogs.com/r1-12king/p/15875613.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有