制作代理服务器需要做什么?

What goes into making a Proxy Server?

我是开发新手,我打算为工作构建一个代理服务器。我不太确定构建代理服务器的内容是什么,我能找到的任何东西都只是告诉我安装一些东西并设置一个;但我希望能够建立自己的。我将在 Scala 中工作,那么制作一个 Scala 到底有什么用呢?

主要有两种代理:

  1. 反向代理
  2. 转发代理

这两种代理可能具有也可能不具有以下 value-added 功能(这是一个示例,远非详尽无遗):

  1. 缓存
  2. 过滤
  3. 负载均衡
  4. 容错

我假设您想构建一个 HTTP/HTTPS 正向或反向代理。

是否为反向代理?

一个或多个应用服务器前面的HTTP负载均衡器是一个反向代理。在这种情况下,后端服务器要么是固定的,基于 headers (Host 是一个流行的)选择,要么在负载平衡时从池中选择。后端可以使用相同的协议,也可以使用自定义的负载平衡协议。对于您的情况,我建议使用相同的协议,除非有非常令人信服的理由不这样做。

是正向代理吗?

end-users 和 Internet 之间的 HTTP 代理是转发代理。在这种情况下,代理建立到请求域的新连接并发送自己的 HTTP 请求,可能直接复制 headers 和用户的内容。代理可以根据域名、URL、IP 地址或内容选择允许或拒绝请求。

两种代理基本上做同样的事情:接收入站请求并代表请求者将其发送到目的地。

简单代理的基本流程如下:

  1. 接受请求者的连接
  2. 复制所有请求元数据(headers、参数)
  3. 建立到目的地的连接
  4. 使用该元数据向目标发送请求

要使其适用于反向代理,目标需要成为代理进程(配置、代码等)的参数。

为了使转发代理工作,请求者需要有一个协议来表达目的地。为此有许多协议:HTTP。 HTTP CONNECT,SOCKS 是主要的。在最简单的情况下,客户端通过 HTTP 连接到代理服务器并发送他们通常直接发送到目标服务器的相同请求。

一个新颖的(据我所知)启用的东西是接受来自后端的连接的反向代理。这将允许 DMZ 无法轻易用于攻击安全区域中的后端。

Kate Madsudaira 在 The Architecture of Open Source Applications 一书中提供 a good description of what proxies do and their benefits at an architectural level