当前位置: 首页 > 知识库问答 >
问题:

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

段干河
2023-03-14

我的网站流量通过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);
}
...
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;

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

共有1个答案

瞿和硕
2023-03-14

您不能SSL“localhost”,因此有三个选项:

>

  • 使用一个可以请求SSL的域

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

  •  类似资料:
    • 我试图使用Cloudflare为CDN/保护运行带有Node.js+Socket.io的Apache,但是出了问题。 我用来在node.js上创建服务器的代码是 我实际上是在使用ProxyPass来处理子域“API”。传递给node.js/express: 这是工作的,但webosocket不是。没有Apache(直接在Express上运行),所有工作都很好,包括WebSocket。但是,我也需要

    • 我正在使用CloudFlare实现一个REST API。我需要添加一些在node.js上用socket.io实现的通知。当socket.io使用活动连接来保持客户机更新时,它将工作,因为连接是在服务器-客户机之间建立的,但是当socket.io进行轮询时会发生什么呢?CloudFlare是否总是为每个客户机使用相同的服务器?

    • 问题内容: 我正在尝试使用我的SSL证书运行socket.io,但是它将无法连接。 我基于聊天示例创建代码: 如果我删除SSL代码,它运行正常,但是与此同时,我收到了一个请求,请求http://domain.com/socket.io/1/?t=1309967919512 请注意,它没有尝试使用https,这会导致它失败。 我正在测试chrome,因为它是该应用程序的目标浏览器。 抱歉,这是一个简

    • 问题内容: 我正在寻找一种通过以下方式集成Node.js + Socket.io + Apache的方法:我希望apache继续提供HTML / JS文件。我希望node.js侦听端口8080上的连接。如下所示: 如果我访问连接到该服务器的HTML,它可以工作,但是我需要转到mydomian.com:8080/index.html。我想要的是能够去mydomian.com/index.html。并

    • 问题内容: 我正在通过GoDaddy设置SSL,以与AWS EC2上的node.js服务器一起使用。我一直无法启动它。 这是我尝试过的: 打算用于域:files.mysite.com 在服务器上,我运行: 然后,我得到CSR:vim files.mysite.csr 我从以下位置复制并粘贴: 最后还有一个空行,我使用rekey离开并粘贴到GoDaddy界面中。 然后,我下载godaddy密钥,该密

    • 正如标题所示,我试图让Apache和socket.io(node.js)更好地发挥作用,尤其是在SSL上。目前,https://www.example.com的客户端应用程序使用socket.io over SSL连接到服务器[SSL protocol]://socket.example.com/socket.io/?query_stuff*。到wss://的连接总是失败,所以socket.io降