首先让我描述一下给定的情况。
我有一个有棱角的JavaScript前端。我需要使用websockets,因此我使用" sockjs"和" stomp-websocket"。
Name
E - 3 m - 1 p - 1 1 - 1
E - 1 m - 1 1 - 1
我的后端是一个Spring Boot应用程序:
var socket,
client;
socket = new SockJS('http://localhost:8080/stomp');
client = Stomp.over(socket);
client.connect({}, function () {
client.subscribe('/dummy/message', function (message) {
console.log('subscribed');
}
});
此设置可以正常运行。即使我在firefox中禁用了websockets,它仍然没有任何问题(在这种情况下回退工作)。
当我启动更多后端实例并使用nginx时,我的问题就开始了。
我的nginx配置是:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/dummy");
registry.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry
.addEndpoint("/stomp")
.setAllowedOrigins("*")
.withSockJS()
.setSessionCookieNeeded(false);
}
}
当我使用多个后端的此设置时,websockets仍可按预期工作但如果我在浏览器中禁用websockets,则后备功能不再起作用。它只是保持连接和即时断开连接。
浏览器控制台出错:
upstream ws_be {
server localhost:8081;
server localhost:8082;
}
server {
listen 8080;
location / {
proxy_pass http://ws_be;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
在后端我收到IO断管错误:
Opening Web Socket... stomp.min.js:8:1893
Web Socket Opened... stomp.min.js:8:1893
>>> CONNECT
accept-version:1.1,1.0
heart-beat:10000,10000
<<< CONNECTED
version:1.1
heart-beat:0,0
connected to server undefined stomp.min.js:8:1893
>>> SUBSCRIBE
id:sub-0
destination:/dummy/message
Whoops! Lost connection to undefined
此时我不知道如何配置nginx或我的后端以使用给定的设置正常工作。 现在我希望有人有这个问题的想法或暗示。
答案 0 :(得分:0)
我找到了一个可能适用于其他人的解决方案。它适用于粘性会话(http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash)
upstream ws_be {
ip_hash;
server localhost:8081;
server localhost:8082;
}
不幸的是,我不允许使用粘性会话。因此,我的搜索不断。