所以我在 docker 容器内有一个 nodejs socketio 服务器。服务器使用与站点相同的 URL(仅在端口 3001 上)以及相同的证书和密钥。但是,我收到此错误,我根本无法理解为什么,我尝试了从不同密码和 tls 版本到删除并重新开始的所有操作。服务器正在运行,正如我在 portainer 中看到的那样,如果我将其配置为 http 并在客户端将其称为 https,我会收到错误,但我将链接更改为 http 并且可以看到输出。在没有 ssl 的情况下使用 docker 在本地测试并工作。证书可用并且适用于网站的其他部分。如果这很重要的话,我还没有接触过 nginx 配置。
下面是我的index.js:
const fs = require("fs");
const https = require("https");
const http = require("http");
const express = require("express");
const { Server } = require("socket.io");
const path = require('path');
const app = express();
const keyPath = path.join(__dirname, 'ssl', 'mykey.key');
const certPath = path.join(__dirname, 'ssl', 'mycert.crt');
const readKeyFile = () => {
try {
console.log(fs.readFileSync(keyPath))
return fs.readFileSync(keyPath);
} catch (err) {
console.error('Error reading SSL key file:', err.message);
process.exit(1);
}
};
const readCertFile = () => {
try {
console.log(fs.readFileSync(certPath))
return fs.readFileSync(certPath);
} catch (err) {
console.error('Error reading SSL certificate file:', err.message);
process.exit(1);
}
};
const transports = ["websocket", "polling"];
const options = {
key: readKeyFile(),
cert: readCertFile(),
transports: transports
};
const httpsServer = https.createServer(app, options);
const io = new Server(httpsServer, {
cors: {
origin: ["https://my-site.com"],
methods: ["GET", "POST"],
},
});
io.on("connection", (socket) => {
console.log(`User Connected: ${socket.id}`);
socket.on("join_room", (data) => {
socket.join(data);
});
socket.on("send_message", (data) => {
socket.to(data.room).emit("receive_message", data);
});
});
httpsServer.listen(3001, () => {
console.log("HTTP SERVER IS RUNNING");
});
这是我的dockerfile:
FROM node:18.8.0
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3001
EXPOSE 3002
CMD ["node", "index.js"]
如有任何建议,我们将不胜感激
我尝试添加不同的密码、tls 版本、任何来源、http 服务器(导致混合内容错误)、传输,不幸的是没有任何效果。
我认为此问题是由于您的 ssl 证书无效造成的 您可能需要购买证书,但我个人使用certbot 对于我所有的开发项目