【问题标题】:Socket.IO with HTTPS over apache present?存在 HTTPS over apache 的 Socket.IO?
【发布时间】:2020-02-03 17:21:38
【问题描述】:

我有一个域名。

我有一个 Raspberry Pi 作为网络服务器。

我已编辑域的 A 记录以将其指向我的服务器的 IP。

通过letsencrypt我得到了一个证书,现在网站在https协议上工作(保持http为调试目的)

我正在开发一个使用 socket.io 但使用 apache+php 处理低级内容的 Messenger 应用程序

所以基本上 apache 监听 80 和 443 而 nodejs 监听 3000

显然,如果我通过 http 访问我的网站 - 一切正常,服务器和客户端都注册连接。

如果我通过 https 访问它 - Chrome 会抛出 net::ERR_CONNECTION_CLOSED 错误(尝试通过端口 3000 连接到 socket.io 时在控制台中。站点本身加载正常)。

客户:

var socket = new io(window.location.host+":3000", { secure: true });

socket.on("connect", function() {
   console.log('success')
});

服务器:

const io = require("socket.io");
const server = io.listen(3000);

console.log("Server started");

server.on("connection", function (socket) {
    console.log("+USER");
    socket.emit("hello", "Connected");
});

我真的不想使用 express 或其他任何东西来保持一切尽可能小,特别是因为我已经有一个网络服务器正在运行。

如何正确设置,以便用户在通过 https 协议访问站点时可以在端口 3000 上连接到我的 socket.io 服务器?

更新: 从看起来我认为这是一个CORS类型的问题。通过 https 访问网站的用户试图连接到不安全的端口(本例为 3000),即使它是同一个域?如果不是所有浏览器,我认为这对很多人来说都是禁忌。 想到一个解决方案,将整个事情从 apache 移动到 nodejs 服务器模块,并通过 https 模块手动分配端口 3000 作为安全端口,但我不知道该怎么做,我真的很想保留我的apache 作为网络服务器,因为至少我比其他任何东西都更熟悉它。

【问题讨论】:

    标签: node.js https socket.io


    【解决方案1】:

    我最终创建了一个单独的 https 服务器,我假设 socket.io 监听(?) 好在我仍然有我的 apache 作为主服务器。我使用这篇文章部分回答了我的问题

    https://serverfault.com/questions/745248/socket-io-combined-with-apache-ssl-server

    服务器

    const fs = require("fs");
    const https = require("https");
    
    var options = {
        key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'),
        cert: fs.readFileSync('/etc/letsencrypt/live/example.com/fullchain.pem')
    };
    
    var server = https.createServer(options);
    server.listen(3000);
    
    var io = require('socket.io').listen(server);
    
    console.log("Server started");
    
    io.on("connection", function (socket) {
        console.log("+USER");
        socket.emit("hello", "Connected");
    
        socket.on("disconnect", () => {
            console.log("-USER");
        })
    });
    
    

    客户

    var s = new io("https://example.com:3000", { secure: true } );
    

    希望这是正确的做法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-31
      • 2018-03-13
      • 2018-11-23
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多