应用程序负载均衡器是否支持WebSockets?

jam*_*her 21 amazon-web-services websocket elastic-load-balancer

我有一个Elastic Beanstalk应用程序,最初配置为使用经典负载均衡器.我发现这在通过WebSocket连接时会导致错误.因此,我将应用程序配置为使用Application Load Balancer,因为我被告知ALB支持WebSockets.但是,似乎他们没有:尝试通过WebSocket连接到我的ALB时,我得到了完全相同的错误.

ALB实际上支持WebSocket吗?AWS文档与此相矛盾.该页面说它只支持HTTP和HTTPS.没有指南来设置ALB以支持WebSocket.

pro*_*erj 35

我能够让WebSockets使用新的Application Load Balancer(ALB).

首先,为您的ALB创建一个新的目标组.此目标组应使用与您的应用程序相同的端口,并且需要配置运行状况检查.但是,主要区别在于您必须启用Stickiness.

添加具有粘性的目标组

接下来,向ALB添加新的侦听器规则.此规则必须具有路由WebSocket设置的路径 - /socket.io.另外,将目标组名称设置为刚刚创建的目标组.

为WebSocket添加侦听规则

我正在为我的服务器使用Node/Hapi/Socket.io(在从Amazon Linux AMI派生的实例上运行).基本设置是:

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

var server = new hapi.Server();
server.connection(config.Application);
websocket.Initialize(server.listener);
Run Code Online (Sandbox Code Playgroud)

WebSocket.js的位置

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.');
            });
        });
    }
};
Run Code Online (Sandbox Code Playgroud)

我使用Angular 1.5x为我的客户端,使用socket.io-client.按如下方式配置WebSocket客户端选项很重要,否则您将无法连接.

(function () {

    'use strict';

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

    runHandler.$inject = ['WebSocketService'];

    function runHandler(WebSocketService) {
       WebSocketService.Initialize();
    }
})();
Run Code Online (Sandbox Code Playgroud)

WebSocket服务:

(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
        };
    }
})();
Run Code Online (Sandbox Code Playgroud)

  • 您的健康检查配置是什么?socket.io 或您的应用程序代码是否有特殊的健康检查端点?就我而言,请求“/”会导致“HTTP 426”响应,ALB 认为该响应不健康。 (2认同)

小智 5

ALB 支持 Websocket,但如果实例至少每隔“空闲超时”秒不发送一些数据,负载均衡器可以关闭连接。