陷阱反向代理设置

我们运行多个Web应用程序,一些内部的,一些内部的/外部的。 我正在提出一个build议,我们使用反向代理服务器来隔离原始服务器,提供SSL终止和(如果可能)提供负载平衡。 对于我们的大部分设置,我相信它可以很好地工作,但是我们有一些鲜为人知的专有应用程序,当我们向前推进反向代理时,可能需要特殊的处理。

将原始服务器从前台移到代理后面,哪种陷阱会导致问题? (例如,如果应用程序需要知道传入请求的IP地址,则可以想象出问题。)

最常见的错误是应用程序中生成的redirect,您必须在反向代理中重写,您已经提到的客户端ip地址问题,如果使用ssl终止,服务器可能想要检查客户端证书或从中获取用户信息。 对于正确的边端反向代理caching,可能需要修改应用程序(正确的过期头,未设置的不需要的cookie等)。 如果你正在使用Windows集成authentication,它可能是无法实现或真正的噩梦

那么你可以调整问题,但我认为这将是更容易解决。 我最喜欢的工具是这个任务:

  • Nginx在外层进行虚拟主机pipe理和位置映射,压缩,ssl,访问日志
  • 清漆caching
  • haproxy用于请求排队,负载均衡和后端检查。
  • 如果您需要高可用性,您的反向代理服务器可以保持工作

逆向代理背后的应用程序可能遇到的问题:

  1. 如果语言或应用程序使用IP地址来保持会话,则到达应用程序的唯一IP地址将是代理服务器。 使用nginxvarnish您可以将X-Forwarded-for标题添加到原始IP地址,并让应用程序识别它。
  2. 负载平衡环境中的会话处理非常棘手。 您必须使用服务器的共享资源来保留其会话信息,以便login的用户可以访问负载平衡应用程序的任何后端并保持其会话。 数据库和Memcached是会话共享的stream行select。
  3. 如果反向代理应用程序在其响应中使用绝对URL,则可能会中断代理上的重写。 即一个应用程序,它会redirect到一个不同于代理服务器的URL。

我目前在前端使用nginx ,并使用varnish进行代理和负载平衡/后端检查。 作为单点故障,在反向代理/负载均衡器上使用集群解决scheme非常重要。

我使用corosync / pacemaker (Linux HA,最新版本)负载均衡负载均衡器:三个负载均衡器,每个负载均衡器使用外部IP地址,RR使用DNS平衡(一个名称指向三个IP地址)。 如果其中一台机器closures,指定给它的IP地址将被corosync移动到另外两台机器中的一台。 同样,如果我添加更多的机器/ IP地址,它们会自动平衡,如果除了一台机器都停机,所有的IP都将在最后一台机器上。 您可以使用corosync来执行主动 – 主动,主动 – 被动和其他许多群集configuration。

一个常见(廉价)的方法是使用鱿鱼作为反向代理…你应该看看他们的常见问题,他们讨论的常见问题.. Squid反转代理常见问题

您也可能面临内部redirect的问题:代理会让应用程序“认为”它位于一个URL中,这显然与真实(外部)URL不同

在Linux / BSD和其他一些操作系统上,代理伪装成客户端IP的可能性很大 – 所以你不会失去可见性(这是使用操作系统的networkingfunction–iptables / ipfw–而不是代理的)。

如果您在某个应用程序上使用客户端证书身份validation,则您将难以replaceSSLterminal点并维护安全性。

负载均衡可能会非常棘手 – 对于http应用程序,您必须在整个群集中实时复制状态 – 或者使用“粘滞会话”,这会破坏容错原理(一种使用有限复制/定义会话故障转移的混合方法通常是最实际的解决scheme)。