Socketio на https с помощью Redis - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть веб-приложение для стека ламп bitnami, операционная система Ubuntu использует Apache в качестве веб-сервера.Сертификат SSL генерируется с использованием Let's Encrypt.Я могу зайти на сайт по http и https.

Furthermore I am using following stacks:
 - nodejs
 - socket.io
 - redis

Отправка уведомлений на моем локальном компьютере работает нормально, websocket работает.

Но на моем производственном сервере, который работает по https, это не такРабота.Я получаю следующие сообщения об ошибках:

socket.io.js: 2 GET https://mypage.com:3000/socket.io/?EIO=3&transport=polling&t=MNxGNEt net :: ERR_CONNECTION_TIMED_OUT

Вот как мой socket.js(Сервер) Похоже:

var app   = require('http').createServer(handler);
var fs    = require('fs');
var io    = require('socket.io')(app);
var Redis = require('ioredis');
var redis = new Redis();

// class declaration
var Redis = require('ioredis');

function handler(req, res) {
    res.writeHead(200);
    res.end('');
}

io.on('connection', function(socket) {});

var redisUserSignedUp = new Redis();

redisUserSignedUp.subscribe('signed-up-channel');

redisUserSignedUp.on('message', function(channel, message) {
    message = JSON.parse(message);
    io.emit(channel + ':' + message.event, message.data);
});

// run server on port 3000
app.listen(3000, function () {
    console.log('Server runs!');
});

В моем производстве я сейчас пытаюсь сделать это так:

var app = require('https').createServer({
    key: fs.readFileSync('/opt/bitnami/apache2/conf/serverKey.pem'),
    cert: fs.readFileSync('/opt/bitnami/apache2/conf/serverCrt.pem')
 }, handler);
var fs    = require('fs');
var io    = require('socket.io')(app);
var Redis = require('ioredis');
var redis = new Redis();

// class declaration
var Redis = require('ioredis');

function handler(req, res) {
    res.writeHead(200);
    res.end('');
}

io.on('connection', function(socket) {});

var redisUserSignedUp = new Redis();

redisUserSignedUp.subscribe('signed-up-channel');

redisUserSignedUp.on('message', function(channel, message) {
    message = JSON.parse(message);
    io.emit(channel + ':' + message.event, message.data);
});

// run server on port 3000
app.listen(3000, function () {
    console.log('Server runs!');
});

И я пытаюсь получить к нему доступ так:

var options = {
    key: fs.readFileSync('/opt/bitnami/apache2/conf/serverKey.pem'),
    cert: fs.readFileSync('/opt/bitnami/apache2/conf/serverCrt.pem'),
    requestCert: true    
}

var app   = require('https').createServer(options, handler);

местный:

const socket = io('http://myapp.test:3000'); // localhost dev Folder is mapped to this .test url
socket.on('signed-in-channel:App\\Events\\UserSignedIn', (data) => {
   …

производство:

var socket = io('mypage.com:3000', {secure: true});

1 Ответ

0 голосов
/ 21 сентября 2018

Вы только создаете сервер http, но для соединения с ssl вам нужен сервер https.

var options = {
    key: fs.readFileSync('./file.pem'),
    cert: fs.readFileSync('./file.crt')
};

var app = require('https').createServer(handler);
...