0

假设我有一个 PHP/Python (Django) 网站。该网站在多个实例服务器上运行。这意味着网站的 URL 是 www.test.com,并且从负载均衡器中,它可以让客户端访问 www.server1.com 或 www.server2.com 等等。

当网站上有一个表单,并且该表单的处理位于同一页面上时: 会不会存在以下情况?: - 用户访问 www.test.com - 在幕后,通过负载均衡器,他访问 www.server* 1 *.com。他填了一张表格。- 表单操作 (URL) 用于 www.test.com - 所以在幕后,通过负载均衡器,他到达 www.server* 2 *.com。所以在这里,是否会缺少所需的表单数据,对我的问题来说更重要的是——“请求”数据(如 Python Django 中的 request.SOMETHING)会丢失吗?因为它之前可能在会话中保存在 www.server* 1 *.com 上,而现在它在 www.server* 2 *.com 上丢失了?

4

2 回答 2

0

该请求将始终包含所有数据,因为这些数据会被转发到边缘服务器。request.POST并将request.GET获得请求中的所有数据。然而,问题是会话数据在该边缘服务器上可能不可用。例如,您在 server1 上启动会话,然后从 server2 请求另一个页面。server2 可能会分配一个新会话并禁止您访问某些内容。

要克服此会话问题,您可以执行以下两项操作之一:

  1. 在服务器之间共享会话(中央会话存储)
  2. 始终将用户转发到同一边缘服务器。一些负载均衡器将转发到的边缘服务器存储在 cookie 中。在随后的请求中,用户每次都被转发到同一个边缘节点。同一个边缘节点将保留该用户的会话,所以没有问题。
于 2012-01-18T11:40:26.303 回答
0

是的,这是一个合理的担忧。由于 Web (HTTP) 的性质,另一个请求可能最终在另一个服务器上。这个问题称为持久性或粘性。

The solution here would be to save all this information on the client side (using cookies) and not rely on server-side sessions. So it would be up to you to implement it like this using Python/Django. Using the client-side approach gives the best performance, and should be the easiest to implement.

Keep in mind that this solution bears quite a significant security risk for man-in-the-middle attacks, unless you encrypt the connection with SSL/TSL (using HTTPS), as all of the client data is stored in the cookies which could be intercepted.

于 2012-01-18T11:40:48.187 回答