【问题标题】:WebSocket is closed before the connection is established - Socket.io usage error on productionWebSocket 在建立连接之前关闭 - 生产中的 Socket.io 使用错误
【发布时间】:2020-10-23 12:12:04
【问题描述】:

我已经设置了一个 socket io web 应用程序,它在本地系统上运行良好,但在生产服务器上,它不起作用,我看到了这些日志

在客户端登录

WebSocket connection to 'wss://mysite.example.com/socket.io/?EIO=3&transport=websocket&sid=NedsfsdfngOnAdfdVAADc' failed: WebSocket is closed before the connection is established.

在服务器端登录

101.254.47.113 - - [02/Jul/2020:19:45:51 +0000] "GET /socket.io/?EIO=3&transport=polling&t=NCJljKs&sid=1FddfgdfGFsfsgYkAAIT HTTP/1.1" 200 915 "https://mysite.example.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
101.254.47.113 - - [02/Jul/2020:19:45:52 +0000] "POST /socket.io/?EIO=3&transport=polling&t=NCJljPV&sid=1FddfgdfGFsfsgYkAAIT HTTP/1.1" 200 2 "https://mysite.example.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
101.254.47.113 - - [02/Jul/2020:19:45:52 +0000] "GET /socket.io/?EIO=3&transport=polling&t=NCH45_E HTTP/1.1" 200 103 "https://mysite.example.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
101.254.47.113 - - [02/Jul/2020:19:45:53 +0000] "GET /socket.io/?EIO=3&transport=polling&t=NCH464Z&sid=JtMPdsfdsjzfdsfd43AAIU HTTP/1.1" 200 915 "https://mysite.example.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"                                                                                                                

我有这些 nginx 配置(我已将非 ssl 流量重定向到 ssl 端口 443

server
{ 
    listen 443 ssl; # managed by Certbot
    server_name mysite.example.com;

    ssl_certificate /etc/letsencrypt/live/mysite.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mysite.example.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
    client_max_body_size 100M;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://127.0.0.1:3000;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        client_max_body_size 100M;
    }
}

server {
        listen 80;
        listen [::]:80;
        server_name mysite.example.com;
        return 301 https://$server_name$request_uri;
}

【问题讨论】:

    标签: nginx websocket socket.io engine.io


    【解决方案1】:

    问题在于websocket 客户端和服务器的版本不匹配。我用正确版本的 websocket 更新了客户端,问题得到了解决。虽然我正在使用其他人编写的代码,但我应该早点检查一下,并且应该耐心调试而不是草率下结论。

    【讨论】:

      【解决方案2】:

      您可以尝试声明一个单独的upstream 块:

      map $http_upgrade $connection_upgrade {
          ''         close;
          default    upgrade;
      }
      upstream backend {
          server       127.0.0.1:3000;
          keepalive    32; # maximum number of idle keepalive connections to upstream server
      }
      server {
          ...
          location / {
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
              proxy_set_header Host $host;
              proxy_set_header X-NginX-Proxy true;
              proxy_pass http://backend;
              proxy_redirect off;
              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection $connection_upgrade;
              client_max_body_size 100M;
          }
      }
      

      你也可以尝试增加proxy_read_timeout的值。

      【讨论】:

      • @invider 再试一次 - 删除 map 块并在原始配置中使用 proxy_set_header Connection "upgrade";
      • Ivan,你能帮我进一步解决这个问题吗?如何调试问题?我在Ubuntu 18.04上使用nginx v1.14.0
      • @invider 抱歉,我不熟悉 socket.io 库。再猜一个 - 添加proxy_set_header X-Forwarded-Proto https; 行。
      • 伊万。这也没有帮助
      • 感谢您帮助伊万。问题在于版本不匹配,我的错。
      猜你喜欢
      • 1970-01-01
      • 2018-02-05
      • 2018-06-13
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      • 2019-12-14
      • 1970-01-01
      相关资源
      最近更新 更多