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

Nginx websocket代理Node.js

曾晨
2023-03-14

我正在尝试使用Node.js来读取凤凰频道使用npm包凤凰频道。凤凰频道是在websockets之上复用的。我在我的phoenix服务器前面使用的是NGINX代理,所以对于NGINX来说,它只是一个websocket。

凤凰频道在网页上运行良好,正如您在此处看到的(您将在网页中看到数据)。

它也可以从我的内部网络上的nodejs正常工作:

const { Socket } = require('phoenix-channels')

let socket = new Socket("https://192.168.1.113:4445/socket")

socket.connect()

// Now that you are connected, you can join channels with a topic:
let channel = socket.channel("room:lobby", {})

channel.on("new_msg", payload => {
  console.log(`${payload.body}`);
});

channel.join()
  .receive("ok", resp => { console.log("Joined successfully", resp) })
  .receive("error", resp => { console.log("Unable to join", resp) })

但是,如果我用域名替换显式IP: PORT地址,并从外部运行它,它就不起作用了(这里与上面的脚本的唯一区别是URL):

const { Socket } = require('phoenix-channels')

let socket = new Socket("https://suprabonds.com/socket")

socket.connect()

// Now that you are connected, you can join channels with a topic:
let channel = socket.channel("room:lobby", {})

channel.on("new_msg", payload => {
  console.log(`${payload.body}`);
});

channel.join()
  .receive("ok", resp => { console.log("Joined successfully", resp) })
  .receive("error", resp => { console.log("Unable to join", resp) })

因此,websockets suprabonds.com 通过代理在浏览器中工作正常,但不能用作nodejs脚本。

以下是我在suprabonds.com的nginx conf:

server {
    server_name suprabonds.com www.suprabonds.com;
    
    location / {
        proxy_pass  http://localhost:4445;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }


    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/suprabonds.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/suprabonds.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}

知道我哪里做错了吗?

以下是/var/log/nginx/access.log的最新条目:

86.143.74.170 - - [22/Apr/2021:15:52:56 +0000] "GET /socket/websocket?vsn=1.0.0 HTTP/1.1" 301 178 "-" "-"
86.143.74.170 - - [22/Apr/2021:15:52:58 +0000] "GET /socket/websocket?vsn=1.0.0 HTTP/1.1" 301 178 "-" "-"
86.143.74.170 - - [22/Apr/2021:15:53:03 +0000] "GET /socket/websocket?vsn=1.0.0 HTTP/1.1" 301 178 "-" "-"
86.143.74.170 - - [22/Apr/2021:15:53:08 +0000] "GET /phoenix/live_reload/socket/websocket?vsn=2.0.0 HTTP/1.1" 101 143 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0"
86.143.74.170 - - [22/Apr/2021:15:53:08 +0000] "GET /socket/websocket?token=undefined&vsn=2.0.0 HTTP/1.1" 101 113098 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0"
86.143.74.170 - - [22/Apr/2021:15:53:19 +0000] "GET /phoenix/live_reload/socket/websocket?vsn=2.0.0 HTTP/1.1" 101 79 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0"
86.143.74.170 - - [22/Apr/2021:15:53:19 +0000] "GET /socket/websocket?token=undefined&vsn=2.0.0 HTTP/1.1" 101 27025 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0"
86.143.74.170 - - [22/Apr/2021:15:53:20 +0000] "GET /socket/websocket?token=undefined&vsn=2.0.0 HTTP/1.1" 101 479 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0"
86.143.74.170 - - [22/Apr/2021:15:53:20 +0000] "GET /phoenix/live_reload/socket/websocket?vsn=2.0.0 HTTP/1.1" 101 79 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0"
86.143.74.170 - - [22/Apr/2021:15:53:23 +0000] "GET /socket/websocket?vsn=1.0.0 HTTP/1.1" 301 178 "-" "-"
86.143.74.170 - - [22/Apr/2021:15:53:24 +0000] "GET /socket/websocket?vsn=1.0.0 HTTP/1.1" 301 178 "-" "-"
86.143.74.170 - - [22/Apr/2021:15:53:26 +0000] "GET /socket/websocket?vsn=1.0.0 HTTP/1.1" 301 178 "-" "-"
86.143.74.170 - - [22/Apr/2021:15:53:31 +0000] "GET /socket/websocket?vsn=1.0.0 HTTP/1.1" 301 178 "-" "-"
86.143.74.170 - - [22/Apr/2021:15:53:41 +0000] "GET /socket/websocket?vsn=1.0.0 HTTP/1.1" 301 178 "-" "-"

火狐是那些工作正常的。其他的(301 178)是来自非工作Node.js脚本的(即使用域名的)。同一位置的error.log文件是空的。
请注意,我也在使用noip动态dns。

共有1个答案

袁宜民
2023-03-14

如果您将URL更改为:

let socket = new Socket("wss://suprabonds.com/socket/websocket?token=undefined")

let socket = new Socket("wss://suprabonds.com/socket/websocket?vsn=1.0.0")

它将连接

 类似资料:
  • 代理用于帮助云联壹云平台访问由于网络或其它问题无法直接访问的云平台。 代理用于帮助 云联壹云 平台访问由于网络或其它问题无法直接访问的云平台。 使用场景: Google Cloud需要设置代理才能访问; 天翼云需要提前把访问的公网IP加入白名单才可以直接访问。 其他情况,如 云联壹云 部署在内网环境,需要通过代理访问外网的公有云平台等。 代理使用规则: 当云账号不设置代理时,代表直连网络; 当请求

  • 代理 本节也将像上一节关于领域一样亲自动手。 我们的最终目标是与本章开头两个组织之间的协议中所示的类似设置。 这意味着您将需要两台FreeRADIUS服务器。 我们假设两者都有默认安装。

  • 本文向大家介绍浅谈Java代理(jdk静态代理、动态代理和cglib动态代理),包括了浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)的使用技巧和注意事项,需要的朋友参考一下 一、代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强。加入一些非业务性代码,比如事务、日志、报警发邮件等操作。 二、jdk静态代理 1、业务接口 2、业务实现类 3、代理类

  • 问题 你构建了一个自定义容器对象,里面包含有列表、元组或其他可迭代对象。 你想直接在你的这个新容器对象上执行迭代操作。 解决方案 实际上你只需要定义一个 __iter__() 方法,将迭代操作代理到容器内部的对象上去。比如: class Node: def __init__(self, value): self._value = value self._ch

  • 太感谢你了,Pouya

  • 代理 proxy 创建一个继承了指定类并且/或者实现了0个或者多个接口的类的对象。这对于创建那种必须要实现某个接口才能得到通知的listener对象很有用。举一个例子, 大家可以看下面 “Desktop Applications” 那一节的例子。那里我们创建了一个继承JFrame类并且实现ActionListener接口的类的对象。

  • map $sent_http_content_type $expires { "text/html" epoch; "text/html; charset=utf-8" epoch; default off; } server { listen 80;