【问题标题】:Websocket Refuses Connection but receiving and emitting are still possibleWebsocket拒绝连接但仍然可以接收和发送
【发布时间】:2021-02-02 14:54:56
【问题描述】:

我有一个在 foo.domain.com 下运行的网站和一个 websocket 以及一个在 api.domain.com 下的 express api,每当我尝试连接到它时,我都会收到 400 作为响应代码,一旦插座连接。但是我正在成功接收和发送事件。 最大的问题是,网络选项卡每隔几秒就会被 get 和 post 请求发送垃圾邮件,作为无法创建 websocket 关系的补偿。

我注意到传输查询在轮询时连接成功,但在其 websocket 时连接失败。

这是我第一次使用 Websockets,所以请多多包涵。

Socket.io 版本:2.3.0

Express 版本:4.17.1

我的 Socket 脚本在我的 api 上运行

var listener = app.listen(6606, function () {
   console.log(`API listening on port ${listener.address().port}`)
});
let io = require('socket.io')(listener);

io.on('connection', socket => {
 console.log("Connected");
 var test = "Welcome";
 setTimeout(() => {
   socket.emit('test', test)
 }, 5000);
 socket.on('received', data => {
   console.log(data)
 })
})

这是我的 Nuxt.js 应用程序中使用的一个

mounted() {
  this.websocket = socket("https://api.domain.com");
  this.websocket.on('test', data => {
    this.websocket.emit('received', {message: "Connected"})
  })
},

我的 Websocket 的控制台输出:

来自网站的网络分析:

【问题讨论】:

    标签: javascript node.js websocket socket.io nuxtjs


    【解决方案1】:

    经过大量研究,我发现这是我的 Apache2 配置的问题。

    我的 API 在 6606 端口下运行。

    问题是 Apache 不想升级我的 WebSocket 请求,而是抛出了一个错误。

    如果你有同样的问题记得把每一次提到的 6606 都改成你的 Websocket 运行的端口

    基本上我必须添加:

      RewriteEngine on
       RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
       RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
       RewriteRule .* ws://127.0.0.1:6606%{REQUEST_URI} [P]
    

    我的完整 Apache 配置:

    <VirtualHost *:80>
     ServerName api.domain.com
      ProxyPass / http://127.0.0.1:6606/
      ProxyPassReverse / http://127.0.0.1:6606/
    </VirtualHost>
    
    <VirtualHost *:443>
     ServerName api.domain.com
      SSLProxyEngine On
      ProxyPass / http://127.0.0.1:6606/
      ProxyPassReverse / http://127.0.0.1:6606/
      SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/api.domain.com/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/api.domain.com/privkey.pem
        SSLCertificateChainFile /etc/letsencrypt/live/api.domain.com/chain.pem
      RewriteEngine on
      RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
      RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
      RewriteRule .* ws://127.0.0.1:6606%{REQUEST_URI} [P]
    </VirtualHost>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2020-10-22
      • 2018-08-06
      相关资源
      最近更新 更多