docker上带有javascript和nginx的websockets

Posted

技术标签:

【中文标题】docker上带有javascript和nginx的websockets【英文标题】:websockets with javascript and nginx on docker 【发布时间】:2021-02-09 08:11:31 【问题描述】:

我有一个 docker compose,其中包含 3 个容器“node-red、influxdb、带有 nginx:alpine 图像的 javascript 网页的 html” 在 html 和 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 网页”并使用没有 docker 的 nginx 和 letencrypt 证书来处理我的 3 个容器的反向代理之前,一切都运行良好。

我面临的问题是,即使我将socket = new WebSocket("ws://mywebsite.com:1880/ws/test") 更改为socket = new WebSocket("ws://mywebsite.com:6100/ws/test"),我也无法使用 websockets 接收数据,我的网页使用的端口 6100 包含这个我有一个 https 错误和socket = new WebSocket("ws://192.170.0.6:6100/ws/test")我的网页容器的 IP 地址以及 new WebSocket("ws://mywebsite/webpage/ws/test") 这由 nginx 处理,以将其路由到我的网页容器使用的 IP 和端口

【问题讨论】:

【参考方案1】:

如果您要连接到通过 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");
    

这将根据页面的加载方式(http 与 https)选择 ws://wss://

【讨论】:

我尝试使用 wss 但我收到 https 错误失败:WebSocket 握手期间出错:意外响应代码:200 对于 nginx,来自服务器外部的任何 http/https 都使用端口 443 并且 nginx 处理反向代理 那你应该去掉wss:// URL中的端口号

以上是关于docker上带有javascript和nginx的websockets的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Docker 上使用 NGINX + Gunicorn 时 NGINX 给出 502 Bad Gateway

带有外部 nginx 和综合的 gitlab docker 注册表

带有 nginx 容器的 Docker Gitlab 容器

使用 Apollo Express、Nginx 和 docker-compose 保护 websocket

仅使用 Nginx 反向代理启用 Docker 端口访问

docker nginx没有加载css样式