将 Socket.IO 与 Apache、Node.js、SSL 和 CloudFlare (HTTP 500) 一起使用

     2023-03-10     293

关键词:

【中文标题】将 Socket.IO 与 Apache、Node.js、SSL 和 CloudFlare (HTTP 500) 一起使用【英文标题】:Using Socket.IO with Apache, Node.js, SSL and CloudFlare (HTTP 500) 【发布时间】:2020-11-22 22:48:01 【问题描述】:

我正在创建一个将连接到 Node.js Socket.IO WebSocket 的网站。此节点服务器在端口 4923 上运行,并且在端点 /socket 上配置了 Socket.IO 节点。我不想通过https://domain1.com:4932/socket 连接,而是从指向我的Apache 服务器的https://domain1.com/socket.io 连接。防火墙为了屏蔽https://domain1.com:4932/socket而屏蔽了4932端口。

Apache 服务器应该代理从 https://domain1.com/socket.iohttps://localhost:4932/socket 的所有连接,包括 SSL。 SSL 证书是来自 Let's Encrypt 的证书。

创建新连接时,Apache 和 Node.JS 服务器之间的 SSL 握手失败。

我的网站流量通过 Cloudflare 并激活了完整的通用 SSL。

在apache虚拟主机中,我有如下配置:

<VirtualHost  *:443>
        ...

        SSLEngine On
        SSLProxyEngine On

        SSLCertificateFile /etc/letsencrypt/live/domain1.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/domain1.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf      

        # Handle wss proxy connections
        RewriteEngine On
        RewriteCond %REQUEST_URI  ^/socket.io             [NC]
        RewriteCond %QUERY_STRING transport=websocket     [NC]
        RewriteRule /(.*)           ws://localhost:4923/$1 [P,L]

        # Autogenerated ProxyPass
        ProxyPass        /socket.io http://localhost:4923/socket
        ProxyPassReverse /socket.io http://localhost:4923/socket
        
        ...
</VirtualHost>

我的 node.js 服务器通过 HTTPS:

const port = 4923;

const fs = require('fs');

var options = 
    key: fs.readFileSync('/etc/letsencrypt/live/domain1.com/privkey.pem'),
    cert: fs.readFileSync('/etc/letsencrypt/live/domain1.com/fullchain.pem'),
;

var app = require('https').createServer(options);
var io = require('socket.io')(app, 
    path: '/socket',
    serveClient: false,
    pingInterval: 10000,
    pingTimeout: 5000,
    cookie: false
);

app.listen(port);

io.httpServer.on('listening', function () 
    console.log("Listening on", port);
);

io.on('connect', (socket) => 
    console.log("Socket connected: " + socket.id);
    socket.on('disconnect', () => 
        console.log("Socket disconnected: " + socket.id);
    );
    socket.on('download-request', (id) => 
        onDownloadRequest(socket, id);
    );
);

function onDownloadRequest(socket, id) 
    console.log("Request from " + socket.id + " and video id: " + id);

同时,在客户端,我在加载窗口时创建一个新的 WebSocket 连接,然后在单击按钮时发送消息。

...
const websocketOptions = 
        server : 
                protocol : 'https://',
                host     : 'domain1.com',
                port     : 443,
                endpoint : '/socket.io'
        
;

function requestDownload() 
        if (isAnySelected() || socket !== null) 
                console.log(document.getElementsByClassName("download-input-box")[0].value);
                socket.emit('download-request', id: document.getElementsByClassName("download-input-box")[0].value);
        


function createConnection() 
        console.log("Creating websocket connection!");
        socket = io.connect(websocketOptions.server.protocol
                        + websocketOptions.server.host
                        + ':'
                        + websocketOptions.server.port
                        + websocketOptions.server.endpoint,
                        transport: 'websocket');


function onWindowLoad() 
        createConnection();


window.onload = onWindowLoad;

这会在 apache 错误日志中产生响应代码 500 和此错误消息:

AH00898: Error during SSL Handshake with remote server returned by /socket.io/, referer: https://domain1.com/

我做错了什么?任何帮助表示赞赏。

编辑:

现在 SSL 握手问题已经解决,我遇到了一个新问题。可以here查看。

【问题讨论】:

【参考方案1】:

你不能使用 SSL “localhost”,所以有三个选项:

使用一个可以请求 SSL 的域

在 HTTP 中使用“localhost”(不是 s)

将“localhost”与 SSL 一起使用,但在 Apache2 配置中禁用“SSLProxyCheckPeerName”。 (见this参考)

SSLProxyCheckPeerName 关闭

【讨论】:

非常感谢! SSL 握手错误现在消失了。但现在我从服务器收到 520 HTTPS 错误。我将针对新问题打开一个后续问题。

Node.js + Socket.io + Apache

】Node.js+Socket.io+Apache【英文标题】:【发布时间】:2011-12-0216:45:32【问题描述】:我正在寻找一种通过以下方式集成的方法:我希望apache继续提供HTML/JS文件。我想让node.js监听端口8080上的连接。像这样:varutil=require("util"),app=requi... 查看详情

node与socket.io搭配小例子-转载

//服务端代码io=require(‘socket.io‘).listen(app),fs=require(‘fs‘),cookie=require(‘cookie‘);request=require(‘request‘);global.userlist={};app.listen(8080);//io.set(‘loglevel‘,1);//将socket.io中的debug信息关闭functi 查看详情

我可以通过 node.js 中的 socket.io 将文件上传到服务器吗?

】我可以通过node.js中的socket.io将文件上传到服务器吗?【英文标题】:CanIuploadafiletoserverbysocket.ioinnode.js?【发布时间】:2011-08-2320:21:55【问题描述】:我有一个socket.io客户端,socket.io服务器在node.js中监听它。我想通过socket.io将... 查看详情

在 Apache 服务器上设置多个 socket.io/node.js 应用程序?

】在Apache服务器上设置多个socket.io/node.js应用程序?【英文标题】:Settingupmultiplesocket.io/node.jsappsonanApacheserver?【发布时间】:2018-09-0821:01:54【问题描述】:我最近一直在搞乱socket.io和node.js,在成功制作了一个基于聊天的应用程... 查看详情

将简单的 Node.js 和 Socket.io 聊天应用程序与 Rails 应用程序连接起来(在 Heroku 上)

】将简单的Node.js和Socket.io聊天应用程序与Rails应用程序连接起来(在Heroku上)【英文标题】:BridgingasimpleNode.js&Socket.iochatappwithaRailsapp(onHeroku)【发布时间】:2012-09-0812:34:13【问题描述】:我有一个在Heroku上运行的基本Node.js和So... 查看详情

与 Node.js / Socket.io 服务器共享 Laravel 会话

】与Node.js/Socket.io服务器共享Laravel会话【英文标题】:ShareLaravelSessionWithNode.js/Socket.ioServer【发布时间】:2018-05-1810:37:53【问题描述】:我的问题很简单。我需要安全地与我的nodejs(socket.io)服务器共享laravel会话。我需要将会话共... 查看详情

如何将 Apache 配置为代理 socket.io 服务器

】如何将Apache配置为代理socket.io服务器【英文标题】:HowtoconfigureApachetoproxysocket.ioserver【发布时间】:2019-08-2106:34:56【问题描述】:我有一个在http://example.com:5000/上运行的web应用程序网站尝试建立与该服务器的socket.io连接以交换... 查看详情

Node.js + Socket IO + Apache + PHP 从 url 中删除端口?

】Node.js+SocketIO+Apache+PHP从url中删除端口?【英文标题】:Node.js+SocketIO+Apache+PHPremoveportfromurl?【发布时间】:2012-01-2416:23:44【问题描述】:我有一些关于在PHP中使用socketIO等问题,我是nodejs/socketio的新手,所以我知道的很少,我在... 查看详情

Node.js + Socket IO + Apache + PHP 便宜的网络服务器? [关闭]

】Node.js+SocketIO+Apache+PHP便宜的网络服务器?[关闭]【英文标题】:Node.js+SocketIO+Apache+PHPcheapwebservers?[closed]【发布时间】:2012-01-2417:05:49【问题描述】:我是使用node.js和socketio的新手,我目前正在服务器上托管我的php网站,现在我... 查看详情

Node.js socket.io 没有响应 iOS socket.io 发出请求

】Node.jssocket.io没有响应iOSsocket.io发出请求【英文标题】:Node.jssocket.ionotrespondingtoiOSsocket.ioemitrequests【发布时间】:2016-01-1203:10:07【问题描述】:我似乎无法弄清楚这一点。我正在测试使用socket.io将iOS客户端应用程序与Node.js服务... 查看详情

带有 Node.js 的 Socket.io

】带有Node.js的Socket.io【英文标题】:Socket.iowithNode.js【发布时间】:2020-01-2704:28:45【问题描述】:我正在使用带有express的Socket.io制作一个Web应用程序。我想向所有客户端发送数据,所有客户端都可以编辑/更新该数据,并且更新... 查看详情

node.js 和 socket.io 与 facebook 好友聊天

】node.js和socket.io与facebook好友聊天【英文标题】:node.jsandsocket.iochatwithfacebookfriends【发布时间】:2014-12-1009:34:58【问题描述】:我正在开发聊天功能,Facebook好友只能在此聊天。我正在使用redis所以保存关系:fb_user_id-user_socket_id... 查看详情

如何使用 socket io 和 node express 发送个人消息

】如何使用socketio和nodeexpress发送个人消息【英文标题】:Howtosendpersonalmessagesusingsocketioandnodeexpress【发布时间】:2016-02-2616:27:59【问题描述】:我正在实施一个聊天系统,您可以在其中向与电击器连接的特定人员发送个人消息。... 查看详情

使用 Socket.IO 将 Node.JS 服务器连接到另一个 Node.JS 服务器?

】使用Socket.IO将Node.JS服务器连接到另一个Node.JS服务器?【英文标题】:ConnectaNode.JSservertoanotherNode.JSserverwithSocket.IO?【发布时间】:2018-12-1514:14:21【问题描述】:我正在尝试使用Socket.IO在两个Node.JS服务器之间发送数据。我通常只... 查看详情

socket.io 手动将用户添加到房间(node.js)

】socket.io手动将用户添加到房间(node.js)【英文标题】:socket.ioaddusertoroommanually(node.js)【发布时间】:2015-05-2905:54:16【问题描述】:我有一个私下运行的聊天应用程序。我的实现是:1-一个用户来到另一个用户个人资料页面并写... 查看详情

node.js socket.io 应用程序 - 如何将某人踢出聊天室?

】node.jssocket.io应用程序-如何将某人踢出聊天室?【英文标题】:node.jssocket.ioapp-Howtokicksomeonefromchatroom?【发布时间】:2016-07-2617:00:15【问题描述】:所以我有一个聊天应用程序,其中一次只能有两个用户在一个房间里。请注意,... 查看详情

为 socket.io 和 SSL / WSS 配置 Apache

】为socket.io和SSL/WSS配置Apache【英文标题】:ComfiguringApacheforsocket.ioandSSL/WSS【发布时间】:2017-02-2521:19:47【问题描述】:正如标题所示,我正在尝试让Apache和Socket.io(node.js)运行良好,尤其是在SSL上。目前,https://www.example.com的客户... 查看详情

node.js、socket.io 和 SSL

】node.js、socket.io和SSL【英文标题】:node.js,socket.ioandSSL【发布时间】:2013-05-2721:01:09【问题描述】:我有一个运行启用SSL的Apache服务器。现在我做了一个小聊天,它使用node.js和socket.io来传输数据。在非安全连接上使用端口8080工... 查看详情