当您在云中运行具有负载均衡器/反向代理、路由器等的服务器时,需要配置它以正常工作,特别是当您将服务器扩展到使用多个实例时。
Socket.io、SockJS和类似库所具有的约束之一是它们需要不断地与服务器的同一实例进行通信。当只有一个服务器实例时,它们可以完美地工作。
当您在云环境中扩展应用程序时,负载均衡器(在Cloud Foundry的情况下为Nginx)将接管,并且请求将被发送到不同的实例,导致Socket.io出现故障。
为了帮助解决这种情况,负载均衡器具有称为“粘性会话”或“会话亲和力”的功能。其主要思想是,如果设置了此属性,则在第一个负载平衡请求之后,所有后续请求都将发送到同一服务器实例。
在Cloud Foundry中,启用基于cookie的粘性会话,适用于设置cookie jsessionid的应用程序。
注意:jsessionid是Java/Spring应用程序中常用于跟踪会话的cookie名称。Cloud Foundry只是采用它作为所有框架的粘性会话cookie。
因此,所有应用程序需要做的就是设置一个名为jsessionid的cookie,以使socket.io正常工作。
app.use(cookieParser); app.use(express.session({store:sessionStore, key:'jsessionid', secret:'your secret here'}));
这些是步骤:
Express设置了一个名为jsessionid的会话cookie。
当socket.io连接时,它使用相同的cookie并命中负载均衡器。
负载均衡器始终将其路由到设置cookie的同一台服务器。
如果您正在使用应用程序负载均衡器,则粘性会话设置位于目标组级别。