amazon-web-services – 应用程序负载均衡器是否支持WebSockets?

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

ALB实际上支持WebSocket吗? AWS文档在此方面是矛盾的. This page表示它只支持HTTP和HTTPS.没有设置ALB以支持WebSocket的指南.

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

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

Add Target Group with Stickiness

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

Add Listen rule for 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);

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.');
            });
        });
    }
};

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

(function () {

    'use strict';

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

    runHandler.$inject = ['WebSocketService'];

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

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

转载注明原文:amazon-web-services – 应用程序负载均衡器是否支持WebSockets? - 代码日志