javascript - 是否可以让来自 NGINX(端口 443)的 SSL 页面也在端口 3000 上使用 socket.io(通过 Node.js)

标签 javascript node.js ssl nginx socket.io

我开发了一个 Node.js 应用程序,它使用 socket.io 实时向 10 到 100 台客户端计算机发送一些基于 JSON 数组的内容。

它运行良好,我对 Node.js 的速度和可靠性感到震惊,我现在正准备将其投入生产并希望使用 https(我已在 NGINX 上成功配置(在 Ubuntu 上运行)我网络上的 14.04 服务器)。

我遇到的问题是,当我使用 URL 的 HTTPS (ssl) 版本时,页面加载正常,但对于网络套接字,由于混合内容,我收到套接字错误。 (注意:我现在将 NGINX 设置为服务器 SSL 和非 SSL 版本,但最终我希望它只提供 SSL 版本)

我已经尝试(在客户端中)像这样使用 https 进行套接字连接:

var socket = io.connect('https://mycooldomaingoeshere.com:3000');

这是我在非 SSL 测试中成功使用的代码(server.js 和 test.html):

//FILE NAME: SERVER.JS

var app = require('express')();
var http = require('http').Server(app); // for node to serve clients
var io = require('socket.io')(http); // socket.io bidirectional from node.js to clients

// THE JSON DATA I WILL EMIT TO CONNECTED CLIENTS...
var myJSON = [{"array":[1,2,3],"boolean":true,"null":null,"number":123,"object":{"a":"b","c":"d","e":"f"},"string":"Hello World"}];

// THE HTML PAGE THAT I WILL SERVE TO CLIENTS CONNECTED ON PORT 3000...
app.get('/', function(req, res) {
    res.sendFile(__dirname + '/test.html');  // note, all connecting clients get served this ONE page
});

// UPON SUCCESSFUL CONNECTION TO THE PORT (3000)...
io.sockets.on('connection', function(socket) {

    console.log('connected the new client!');

    setInterval(function(){
        // EMIT OUT THE JSON ARRAY TO CLIENTS EVERY 3 SECONDS
        socket.volatile.emit('passingJSON', myJSON); //emit to all clients
    }, 3000);
}); 

// OK, LETS LISTEN FOR ANY CLIENTS TRYING TO CONNECT ON PORT 3000
http.listen(3000, function() { //listen to 3000
    console.log('listening on *:3000...');
});

这是为客户提供服务的页面 (test.html):

<html>
<head>

<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>

<script>

$(document).ready(function(){
     var socket = io.connect('http://localhost:3000');

    // HERES SOMETHING THE NODE.JS SERVER CAN 'CALL' OR INVOKE...
    socket.on('passingJSON', function(data) {
            console.log(data);
            console.log(new Date().toLocaleString());  
    });
});

</script>
</head>

<body>
    this is a test page that uses node.js and socket.io
</body>
</html>

我使用的 Node 和 NPM 包版本是:

  • socket.io v1.4.5
  • 表达 v4.13.4
  • npm v3.9.5
  • node.js v6.2.2

我的问题是我需要在我的代码中添加什么或做不同的事情才能使 socket.io 能够在父页面的 HTTPS 源内/旁边工作?

最佳答案

我会建议像这样使用客户端连接:

var socket = io.connect();

这应该做的是自动适应 httpshttp

关于javascript - 是否可以让来自 NGINX(端口 443)的 SSL 页面也在端口 3000 上使用 socket.io(通过 Node.js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40667508/

相关文章:

javascript - React Hooks - 如何重构这些动态生成的输入?

javascript - 未指定 id 时的 addEventListener()

node.js - React.js 测试 Node 服务器是否正在运行

javascript - 'node_modules' 不是内部或外部命令、可运行程序或批处理文件

javascript - $lookup : foreignKey 的 mongodb 未知参数

ssl - 在 Play Framework 1.2.7 中使用的 Netty 的 SSL 处理程序中处理多个证书

ssl - IIS:HTTPS 绑定(bind)的 RequireSSL false

javascript - 如何计算文档高度并将宽度添加到 div 将显示剩余页面

web-services - 服务器通过 HTTPS 传输数据的重量有多大?

javascript - 样式化组件 - 比 ${props => props.theme...} 更容易访问传递的主题属性