【发布时间】:2017-08-24 12:11:12
【问题描述】:
让我先描述一下给定的情况。
我有一个有角度的 JavaScript 前端。我需要使用 websockets,因此我使用“sockjs”和“stomp-websocket”。
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');
}
});
我的后端是一个 Spring Boot 应用程序:
@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);
}
}
此设置可以正常工作。即使我在 Firefox 中禁用了 websocket,它仍然可以正常工作(在这种情况下可以使用回退)。
当我启动更多后端实例并使用 nginx 时,我的问题就开始了。
我的 nginx 配置是:
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";
}
}
当我将此设置与多个后端一起使用时,websockets 仍然可以按预期工作但是如果我在浏览器中禁用 websockets,则后备将不再起作用。它只是保持连接并立即断开连接。
浏览器控制台出错:
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
在后端我收到一个 IO 损坏的管道错误:
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Datenübergabe unterbrochen (broken pipe)
此时我不知道如何配置 nginx 或我的后端才能在给定的设置下正常工作。 现在我希望有人对这个问题有想法或提示。
【问题讨论】:
-
您能否在您的浏览器开发工具中检查浏览器选择了哪种传输方式以及您在网络选项卡中收到什么错误消息?
-
它不断重复这四个请求: - GET localhost:8080/stomp/info -> 状态 200 - POST localhost:8080/stomp/101/x_bobkwk/xhr_streaming -> 状态 200 中止 - POST localhost:8080/stomp/101/x_bobkwk/xhr_send -> 状态 204 - POST localhost:8080/stomp/101/x_bobkwk/xhr_send ->状态 404
-
这样的话,可能和这个有关? serverfault.com/questions/789417/…
-
感谢您的回复。我尝试禁用 proxy_buffering,但没有解决问题。
-
尝试不使用 nginx - 如果它有效,则意味着这个问题应该是关于 nginx(并移至 serverfault)
标签: javascript nginx spring-boot stomp spring-websocket