node.js - 使用 redis 在 https 上的 Socketio
问题描述
我在 bitnami 灯堆栈上有一个 web 应用程序,操作系统是 ubuntu,它使用 Apache 作为 web 服务器。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});
解决方案
您只需创建一个 http 服务器,但要连接 ssl,您需要一个 https 服务器。
var options = {
key: fs.readFileSync('./file.pem'),
cert: fs.readFileSync('./file.crt')
};
var app = require('https').createServer(handler);
推荐阅读
- ubuntu-16.04 - E: 包 'oracle-java8-installer' 没有安装候选
- laravel - 找不到 Orchestra 测试台
- java - 递归搜索房间数组列表中的路径
- workflow - 如何将 UIPath Workflow 转换为 Activity 或创建自定义 Activity?
- java - 如何修复android中的“无法访问android.support.v4.app.ActivityCompat not found的ActivityCompat类文件”错误?
- java - 如何在 Java 编程中修复“线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常”
- forms - 如何使用 redux-form 清除所有字段(不重置)?
- wpf - WPF数据网格导出到excel编码问题
- python - 如何使用python写入命令行
- powershell - Powershell无需继承即可获得文件夹权限