2017-08-24 6 views
3

まず、与えられた状況を説明しましょう。春のブートアプリケーションで長いポーリングを処理するには、nginxで負荷分散しますか?

私は角度のあるJavaScriptのフロントエンドを持っています。私はウェブソケットを使う必要があるので、私は "sockjs"と "stomp-websocket"を使います。

@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); 
    } 
} 

この設定は何の問題もなく動作します。

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で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"; 
    } 
} 

は、WebSocketをまだ私は私のブラウザでWebSocketをを無効にした場合のフォールバックはもう動作しません動作します。それは単に接続を維持し、即座に切断します。ブラウザのコンソールで

エラー:私はnginxのか、私を設定する必要がどのように私は見当がつかない。この時点で

org.apache.catalina.connector.ClientAbortException: java.io.IOException: Datenübergabe unterbrochen (broken pipe) 

:私は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 

特定のセットアップで正しく動作するようにバックエンドを設定します。 誰かにこの問題のアイデアやヒントがあることを願っています。

+0

ブラウザでどのトランスポートが選択されているのか、またネットワークタブではどのようなエラーメッセージが表示されるのでしょうか? –

+0

これは、次の4つの要求を繰り返し続けます。 - GET http:// localhost:8080/stomp/info - > Status 200 - POST http:// localhost:8080/stomp/101/x_bobkwk/xhr_streaming - > Status 200 Aboted - POST http:// localhost:8080/stomp/101/x_bobkwk/xhr_send - >ステータス204 - POST http:// localhost:8080/stomp/101/x_bobkwk/xhr_send - >ステータス404 – Vadim

+0

その場合は、おそらくこれに関連する? https://serverfault.com/questions/789417/should-proxy-buffering-be-disabled-in-nginx-to-support-sockjs-xhr-streaming –

答えて

0

私は1つの解決策を見つけましたが、それは他の人にとってはうまくいくかもしれません。それは

upstream ws_be { 
    ip_hash; 
    server localhost:8081; 
    server localhost:8082; 
} 

残念ながら、私はスティッキーセッションを使用することはできないのですスティッキーセッション(http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash)で動作します。そのため私の検索は継続しています。

関連する問題