ALB 是否真正支持 WebSocket?AWS 文档对此存在矛盾。此页面 表示它仅支持 HTTP 和 HTTPS。没有关于设置 ALB 支持 WebSocket 的指南。
我成功地使用新的应用程序负载均衡器(ALB)实现了WebSockets。
首先,为您的ALB创建一个新的目标组。此目标组应使用与应用程序相同的端口,并且需要配置健康检查。但是,主要区别在于您必须启用"粘性"设置。
接下来,向您的ALB添加一个新的侦听器规则。此规则必须具有路径以路由WebSocket设置 - /socket.io。同时,将目标组名称设置为您刚刚创建的目标组。
我正在使用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
};
}
})();
ALB可以支持Websocket,但是如果实例在"空闲超时"秒内没有发送任何数据,负载均衡器会关闭连接。
应用程序负载均衡器支持websocket。但是在2017年2月23日之前,不支持websocket健康检查。他们可能会在以后添加一个选项。当您想要在应用程序负载均衡器后面使用websocket时,需要为目标组设置HTTP或HTTPS健康检查。
来自AWS文档的说明: “请注意,健康检查不支持WebSockets。”
参考资料: http://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html
关于Node.js 当我们在客户端使用Socket.io并调用socket.js库时, 就像这样
const socket = io('domain.com');
const socket = io(window.location.origin, {reconnect: true,transports: ['websocket']});
确实解决了我的问题