javascript - docker上带有javascript和nginx的websockets
问题描述
我有一个 docker compose,在 html 和 JavaScript 网页中包含 3 个容器“node-red、influxdb、带有 nginx:alpine 图像的 JavaScript 网页”我有一个图像列表,我根据来的数据更改图像通过 websockets 从节点红色
我用这个 JavaScript 函数接收我的数据
function startConnect() {
document.getElementById('dt').click();
socket = new WebSocket("ws://mywebsite.com:1880/ws/test");
socket.onmessage = function(e) {onMessageArrived(e.data)}
console.log("connected");
socket.onopen = function() {socket.send("1")};
}
// Called when a message arrives
function onMessageArrived(message) {
console.log("onMessageArrived: " + message);
var obj = JSON.parse(message);
document.getElementById("image1").src = "myimage/" + obj.L + "_DL.png";
document.getElementById("image2").src = "myimage/" + obj.M + obj.F + obj.S + "_" + obj.Z48_70 + "_M.png";
document.getElementById("image3").src = "myimage"+ obj.V + obj.V + "_X";
}
在我决定将 docker 用于“node-red 和 influx 以及 html 网页”并使用 nginx without docker 和 letencrypt 证书来处理我的 3 个容器的反向代理之前,一切都运行良好。
我面临的问题是,即使我将网页使用的端口 6100 更改为我的网页使用的端口 6100,我也无法使用 websockets 接收数据,socket = new WebSocket("ws://mywebsite.com:1880/ws/test")
我socket = new WebSocket("ws://mywebsite.com:6100/ws/test")
遇到了 https 错误,并且socket = new WebSocket("ws://192.170.0.6:6100/ws/test")
我的网页容器的 IP 地址也是new WebSocket("ws://mywebsite/webpage/ws/test")
如此由 nginx 处理,将其路由到我的网页容器使用的 IP 和端口
解决方案
如果您要连接到通过 HTTPS 引导的 WebSocket 地址,那么您需要使用该wss:
方案而不是ws:
因此,如果您在端口 6100 上启用了 https,那么您需要使用wss://mywebsite.com:6100/ws/test
(如果您使用 nginx 作为反向代理,是否有任何理由不分别为 http/https 使用默认端口 80 和 443?)
编辑:如果您的代理分别为 http/https 提供 80/443 的默认端口,那么您应该使用如下内容:
function startConnect() {
document.getElementById('dt').click();
if (location.scheme === 'http:' ) {
socket = new WebSocket("ws://mywebsite.com/ws/test");
} else {
socket = new WebSocket("wss://mywebsite.com/ws/test");
}
socket.onmessage = function(e) {onMessageArrived(e.data)}
console.log("connected");
socket.onopen = function() {socket.send("1")};
}
这将选择ws://
或wss://
取决于页面的加载方式(http vs https)
推荐阅读
- c# - 如何在 ASP.Net Core 5 Identity 中从 Google OAUTH 获取刷新令牌?
- flutter - 在颤动中更改文本对象中字符串插值的颜色
- mysql - 无法连接到 SQL docker 容器(SSL 问题)
- docker - 如何将 VueJS 应用程序 Dockerize 用于生产并跳过 Dev 依赖项的安装
- php - sprintf (PHP) 返回不需要的字符 (×)
- c# - 在 Unity C# 中,我试图在光线投射命中的地方生成一个立方体
- spring-boot - Pushy APNS http2 协议 - io.netty.util.concurrent.PromiseCombiner 错误中没有初始化方法
- python - Jupyter notebook 停止打印输出
- python - 按条件过滤行并使用 python pandas 从数据框中选择多列
- javascript - 使用 domtoimage.toPng 为 pdf 页面内的两个 div 导出 pdf