2012-01-18 65 views
0

假设我有一个PHP/Python(Django)网站。 该网站正在多个实例服务器上运行。 含义该网站的网址是www.test.com,并从负载平衡器,它可以得到客户端www.server1.com或www.server2.com等。多个实例(服务器)上的网站表单(POST)网站(Python Django/PHP)

当网站上有表格,并且此表格的处理位于同一页面上时: 可以存在以下情况吗? : - 用户访问www.test.com - 在幕后,通过负载均衡器,他可以访问www.server * * .com。他填写表格。 - 表单动作(URL)用于www.test.com - 所以在幕后,通过负载均衡器,他可以访问www.server * * .com。 所以在这里,将需要的表单数据,更重要的是我的问题 - “请求”数据(如Python Django中的request.SOMETHING)将会丢失?因为它可能在会议前被保存在www.server * * .com,现在它在www.server * * .com中缺失。

回答

0

该请求将始终包含所有数据,因为该数据会被转发到边缘服务器。 request.POSTrequest.GET将具有来自请求的所有数据。但是,问题是会话数据可能无法在该边缘服务器上使用。例如,您在server1上开始会话,然后从server2请求另一个页面。 server2可能会分配一个新的会话并禁止您访问某些内容。

为了克服这个问题的会议,你可以做两件事情之一:服务器之间

  1. 共享会话(中央会话存储)
  2. 永远向前的用户在同一边缘服务器。一些负载均衡器将这个forwared-to-edge服务器存储在一个cookie中。在随后的请求中,用户每次都会被转发到同一个边缘节点。相同的边缘节点将保持该用户的会话,所以没有问题。
+0

但是,如果您想要进行故障切换,则选项2本身是不够的(没有选项1)。假设您将会话保存在第一台服务器上,并且在下一次请求时服务器不可用。你已经失去了客户的状态。 – 2012-01-18 11:47:48

+0

@UkuLoskit我不明白如果没有失败的负载平衡器,网站将如何工作。但是,提供故障安全将是一个好主意。 – bouke 2012-01-18 11:50:54

+0

对不起,我的意思是服务器,而不是负载平衡器。 – 2012-01-18 11:51:55

0

是的,这是一个值得关注的问题。由于Web(HTTP)的性质,其他请求可能会在另一台服务器上结束。这个问题被称为持久性或粘性。

这里的解决方案是将所有这些信息保存在客户端(使用cookie)而不依赖于服务器端会话。所以这将取决于你如何使用Python/Django来实现它。使用客户端方法提供最佳性能,并且应该是最容易实现的。

请记住,除非使用SSL/TSL(使用HTTPS)加密连接,否则此解决方案对中间人攻击具有相当严重的安全风险,因为所有客户端数据均存储在可能被拦截的饼干。