Answers:
大型网站可能会在多台计算机之间实现“负载平衡”。在许多负载平衡设置中,用户可能在会话期间访问任何后端计算机。因此,存在许多方法可以允许许多计算机共享用户会话。
选择的方法将取决于所采用的负载平衡的方式以及后端存储的可用性/容量:
会话信息仅存储在cookie中:会话信息(而不仅仅是会话标识符)存储在用户的cookie中。例如,用户的cookie可能包含其购物篮中的内容。为了防止用户篡改会话数据,可以将HMAC与cookie一起提供。此方法可能最不适合大多数应用程序:
负载平衡器始终将用户定向到同一台计算机:许多负载平衡器可以设置自己的会话cookie,以指示用户从哪个后端计算机发出请求,并在将来将其定向到该计算机。由于用户始终被定向到同一台计算机,因此不需要在多台计算机之间共享会话。在某些情况下这可能会很好:
共享的后端数据库或键/值存储:会话信息存储在后端数据库中,所有Web服务器都可以访问该数据库来查询和更新。用户的浏览器存储一个cookie,其中包含指向会话信息的标识符(例如会话ID)。这可能是三种方法中最干净的方法:
总体而言,大多数动态Web应用程序执行许多数据库查询或键/值存储请求,因此数据库或键/值存储是会话数据的逻辑存储位置。
如果您的问题是如何在多个前端Web服务器之间维护会话,那么答案通常是使用集中式数据库。无需依赖Web服务器实例来跟踪本地文件系统上的会话文件,而是将会话ID和数据写入中央数据库,所有Web服务器都将从那里检索数据。
没有@David Pashley提到的,使用nemcached似乎是一个很好的解决方案
这意味着让所有服务器共享一个远程memcached实例,并使用提供自己的会话处理程序的memcache PECL扩展。
它只需要更改php配置中的两个参数!
这是一个很好的教程http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/
IIRC,在DotNetRocks#440中,他们说一个服务器周期。不知道情况是否仍然如此。
编辑:实际上是Hanselminutes#134。抱歉。
a)您可以将会话信息存储在用户cookie中。请参阅无状态的强化cookie,该cookie不会在服务器端存储任何数据,但会保留会话状态http://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdf。b)您可以将会话后端存储更改为数据库或内存缓存。为了消除单点故障,您可以设置数据库复制或多个内存缓存节点。请注意,在此类设置中建议使用memcached,在这种设置中,在会话中丢失用户状态不是很大的错误,并且不会使他感到非常不快。对于保持状态至关重要的情况,请使用数据库。PHP,Django和Rails都允许开发人员编写自定义会话后端。