我们运行多个Web应用程序,一些内部的,一些内部的/外部的。 我正在提出一个build议,我们使用反向代理服务器来隔离原始服务器,提供SSL终止和(如果可能)提供负载平衡。 对于我们的大部分设置,我相信它可以很好地工作,但是我们有一些鲜为人知的专有应用程序,当我们向前推进反向代理时,可能需要特殊的处理。
将原始服务器从前台移到代理后面,哪种陷阱会导致问题? (例如,如果应用程序需要知道传入请求的IP地址,则可以想象出问题。)
最常见的错误是应用程序中生成的redirect,您必须在反向代理中重写,您已经提到的客户端ip地址问题,如果使用ssl终止,服务器可能想要检查客户端证书或从中获取用户信息。 对于正确的边端反向代理caching,可能需要修改应用程序(正确的过期头,未设置的不需要的cookie等)。 如果你正在使用Windows集成authentication,它可能是无法实现或真正的噩梦
那么你可以调整问题,但我认为这将是更容易解决。 我最喜欢的工具是这个任务:
逆向代理背后的应用程序可能遇到的问题:
nginx和varnish您可以将X-Forwarded-for标题添加到原始IP地址,并让应用程序识别它。 我目前在前端使用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)。