2016-09-05 2 views
11

Ich habe eine Elastic Beanstalk-Anwendung, die ursprünglich für die Verwendung eines Classic Load Balancer konfiguriert wurde. Ich habe festgestellt, dass dies bei der Verbindung über WebSocket zu Fehlern geführt hat. Aus diesem Grund habe ich die Anwendung so konfiguriert, dass stattdessen ein Application Load Balancer verwendet wird, da mir gesagt wurde, dass ALBs WebSockets unterstützen. Es scheint jedoch, dass sie nicht: Ich bekomme genau den gleichen Fehler beim Versuch, über WebSocket eine Verbindung zu meinem ALB herzustellen.Unterstützt ein Application Load Balancer WebSockets?

Unterstützen ALBs tatsächlich WebSocket? Die AWS-Dokumentation widerspricht sich dazu. This page sagt, es unterstützt nur HTTP und HTTPS. Es gibt keine Anleitungen zum Einrichten eines ALB zur Unterstützung von WebSocket.

+0

Aus dem offiziellen Blog: https://aws.amazon.com/blogs/aws/new-aws-application-load-balancer/ „ALB bietet native Unterstützung für WebSocket über die ws: // und wss: // protocols. " –

+0

Trotz dieser Ankündigung und der FAQ-Abschnitt für die ALB, bekomme ich auch den gleichen Fehler auf einem ALB (http Status 501 nicht implementiert) – nont

+0

trotz https: //aws.amazon.com/elasticloadbalancing/applicationloadbalancer/faqs/ – nont

Antwort

20

Ich konnte WebSockets mit dem neuen Application Load Balancer (ALB) arbeiten.

Erstellen Sie zuerst eine neue Zielgruppe für Ihr ALB. Diese Zielgruppe sollte den gleichen Port wie Ihre Anwendung verwenden und Health Checks konfiguriert haben. Der Hauptunterschied besteht jedoch darin, dass Sie Klebrigkeit aktivieren müssen.

Add Target Group with Stickiness

Als nächstes werden eine neue Listener-Regel zu Ihrem ALB hinzuzufügen. Diese Regel muss über einen Pfad zum Routing des WebSocket-Setups - /socket.io verfügen. Legen Sie den Zielgruppennamen auch auf die soeben erstellte Zielgruppe fest.

Add Listen rule for WebSocket

Ich bin mit Node/Hapi/Socket.io für meinen Server (auf Instanz läuft, abgeleitet von Amazon Linux AMI). Grundkonfiguration ist:

const hapi = require('hapi'); 
const websocket = require('./WebSocket'); 

var server = new hapi.Server(); 
server.connection(config.Application); 
websocket.Initialize(server.listener); 

wo WebSocket.js

ist
var io = null; 

module.exports = { 

    Initialize: function (http) { 

     io = require('socket.io')(http); 

     io.on('connection', function (socket) { 
      console.log('Websocket ' + socket.id + ' connected.'); 

      socket.on('disconnect', function() { 
       console.log('Websocket ' + socket.id + ' disconnected.'); 
      }); 
     }); 
    } 
}; 

I Angular 1,5x für meine Kunden bin mit, mit socket.io-Client. Es ist wichtig, die WebSocket-Clientoptionen wie folgt zu konfigurieren, oder Sie können keine Verbindung herstellen.

(function() { 

    'use strict'; 

    angular 
     .module('XXXXX', []) 
     .run(runHandler); 

    runHandler.$inject = ['WebSocketService']; 

    function runHandler(WebSocketService) { 
     WebSocketService.Initialize(); 
    } 
})(); 

Der WebSocket-Service:

(function() { 

    'use strict'; 

    angular 
     .module('XXXXX') 
     .factory('WebSocketService', WebSocketService); 

    WebSocketService.$inject = []; 

    function WebSocketService() { 

     var socket = null; 

     function initialize() { 

      var url = 'http://' + ALB_URL + ':5800'; 

      socket = io(url, {transports: ['websocket'], upgrade: false}); 

      socket.on('connect', function() { 
       console.log('Socket connected'); 
      }); 

      socket.on('disconnect', function() { 
       console.log('Socket disconnected'); 
      }); 
     } 

     return { 
      Initialize: initialize 
     }; 
    } 
})(); 
+0

Was ist Ihre Health Check-Konfiguration? Hat socket.io oder Ihr Anwendungscode einen speziellen Endpunkt für die Statusprüfung? In meinem Fall führt das Anfordern von '/' zu einer 'HTTP 426' Antwort, die ALB nicht als gesund ansieht. – dskrvk

+1

Ich habe zwei VMs hinter dem ALB. Jeder hostet einen Knoten-Webdienst. Ich habe einen REST-Endpunkt unter http: : 5800/v1/monitor/ping, der das aktuelle Datum/die Uhrzeit des Servers als Zeichenfolge mit HTTP 200 OK zurückgibt. Ich konfiguriere diese Informationen in meiner API (nicht Web-Socket) Zielgruppe-> Health Checks. – programmerj

+0

@programmerj Also, was wäre dein ALB_URL? "xxx.us-east-1.elasticbeanstalk.com/socket.io:5800"? Ist es erforderlich, dass der Pfad genau "socket.io" ist oder ist es willkürlich? Flask-socketio macht Websocket über Port 5000 verfügbar, also würde ich Port 5000 benutzen? – Alpenglow

0

ALB Unterstützung Websocket aber der Load Balancer kann die Verbindung schließen, wenn die Instanz nicht zumindest einige Daten sendet alle "Idle Timeout" Sekunden.

1

Application Load Balancer unterstützt Websocket. Aber keine Unterstützung für den Websocket-Gesundheitscheck bis zum 23. Februar 2017. Sie können später eine Option hinzufügen. Sie müssen eine HTTP- oder HTTPS-Statusprüfung für Ihre Zielgruppe einrichten, wenn Sie eine Websocket hinter Application Load Balancer verwenden möchten.

Von AWS-Dokument: "Beachten Sie, dass Health Checks WebSockets nicht unterstützen."

Referenz: http://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html