当前位置: 首页 > 面试题库 >

WebSocket连接到 失败:WebSocket握手期间出错:意外的响应代码:521

长孙燕七
2023-03-14
问题内容

我在连接到套接字服务器时遇到问题。

WebSocket connection to <URL> failed: Error during WebSocket handshake: Unexpected response code: 521

我有两个不同的云服务器(1)用于客户端项目,(2)用于套接字服务器。

(1)客户项目:

var token = "{{ csrf_token() }}";
window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: "{{env('SOCKET_SERVER_HOST')}}",
    origin: '*',
    transports: ['websocket', 'polling', 'flashsocket', 'ws', 'wss'],
    auth: {
          headers: {
                'X-CSRF-TOKEN' : token,
          }
    },
    csrfToken:token,
    port:"6001",
});

(2)套接字服务器

1. nginx

server {
  listen        443 ssl;
  listen        [::]:443 ssl;
  server_name   mydomain.com;

  error_log     /var/log/nginx/proxy-error.log error;

  ssl                         on;
  ssl_certificate             /etc/nginx/certs/mydomain.com.pem;
  ssl_certificate_key         /etc/nginx/certs/mydomain.com.key;
  ssl_session_timeout         3m;
  ssl_session_cache           shared:SSL:50m;
  ssl_protocols               TLSv1.1 TLSv1.2;
  ssl_ecdh_curve              secp384r1;

  location /socket.io {
    proxy_pass                          http://mydomaincom:6001;
    proxy_set_header Host               $host;
    proxy_set_header X-Real-IP          $remote_addr;

    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto  https;
    proxy_set_header X-VerifiedViaNginx yes;
    proxy_read_timeout                  60;
    proxy_connect_timeout               60;
    proxy_redirect                      off;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_cache_bypass $http_upgrade;
  }
}

laravel-echo-server.json

下面是laravel-echo-server配置。

{
    "authHost": "https://mydomaincom",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "xxxxxxxxxx",
            "key": "yyyyyyyyyyyyyyyyyyyyyyyy"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "6001",
    "protocol": "https",
    "socketio": {},
    "secureOptions": 67108864,
    "sslCertPath": "/etc/nginx/certs/mydomain.com.pem",
    "sslKeyPath": "/etc/nginx/certs/mydomain.com.key",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "subscribers": {
        "http": true,
        "redis": true
    },
    "apiOriginAllow": {
        "allowCors": true,
        "allowOrigin": "*",
        "allowMethods": "GET, POST",
        "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
    }
}

主管

这是主管配置。

[program:echo-worker]
directory=/home/user/apps/epanel
process_name=%(program_name)s_%(process_num)02d
command=laravel-echo-server start --config="ehealth-echo-server.json"
autostart=true
autorestart=true
user=user
numprocs=1
redirect_stderr=true
stdout_logfile=/home/user/apps/epanel/echo.log

2. Laravel回声服务器

注意:我使用redis和,laravel-echo-server并且效果很好。

有没有人有办法解决吗?


问题答案:

本文档适用于那些使用laravel echo服务器&nginx&socket.io&redis-server并在客户端项目和redis-
server之间使用分开的服务器的用户。

1)编辑/etc/redis/redis.conf

bind 127.0.0.1
supervised no

bind 0.0.0.0
supervised systemd

2)更新/etc/systemd/system/redis.service[Service]

Type=notify
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf  --supervised systemd

3)Nginx/etc/nginx/sites-enabled/reverse-proxy.conf

server {
  listen        443 ssl;
  listen        [::]:443 ssl;
  server_name   mysitecom;

  error_log     /var/log/nginx/proxy-error.log error;

  # Start the SSL configurations
  ssl                         on;
  ssl_certificate             /etc/nginx/certs/mysitecom.pem;
  ssl_certificate_key         /etc/nginx/certs/mysitecom.key;
  ssl_session_timeout         3m;
  ssl_session_cache           shared:SSL:50m;
  ssl_protocols               TLSv1.1 TLSv1.2;

  # Diffie Hellmann performance improvements
  ssl_ecdh_curve              secp384r1;

  location /socket.io {
    proxy_pass                          http://mysitecom:2096;
    proxy_http_version 1.1;
    proxy_set_header Upgrade            $http_upgrade;
    proxy_set_header Connection         "upgrade";
    proxy_set_header Host               $host;
    proxy_set_header X-Real-IP          $remote_addr;
    proxy_buffers 16 4k;
    proxy_buffer_size 2k;

    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto  https;
    proxy_set_header X-VerifiedViaNginx yes;
    proxy_read_timeout                  2h;
    proxy_connect_timeout               2h;
    proxy_redirect                      off;
  }
}

4)laravel-echo-server.json

{
    "authHost": "https://mysitecom",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "e45c056ec8ca8bd7",
            "key": "88d316b5cccafbc5e905aa9ee13e63f7"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {
            "host": "0.0.0.0",
            "port": "6379"
        },
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "2096",
    "protocol": "https",
    "socketio": {},
    "secureOptions": 67108864,
    "sslCertPath": "/etc/nginx/certs/mysitecom.pem",
    "sslKeyPath": "/etc/nginx/certs/mysitecom.key",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "subscribers": {
        "http": true,
        "redis": true
    },
    "apiOriginAllow": {
        "allowCors": true,
        "allowOrigin": "*",
        "allowMethods": "GET, POST",
        "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
    }
}

注意: 对于使用DNS连接的用户,cloudflare请在此处将默认的socket.io端口6001更改为以下端口。



 类似资料:
  • 我正试图将socket.io与Angular集成,但在建立从客户端到服务器的连接时遇到了困难。我已经查看了其他相关问题,但我的问题发生在本地,所以中间没有web服务器。 这就是我的服务器代码的样子: 我使用Grunt按以下顺序加载客户端JavaScript文件: 我刚刚意识到websockets正在部分工作。我在Chrome开发者控制台看到一个101交换协议请求。但是,我看到的帧只有Engine.

  • 我正在使用C Builder 10.1柏林编写一个简单的WebSocket服务器应用程序,它在端口上侦听从网络浏览器发送的一些命令,如谷歌Chrome。 在我的表单上,我有一个TMemo、TButton和TIdHTTPServer,我有以下代码: 从Chrome,我执行这个Javascript代码: 但是我从Chrome上得到了这个错误: VM77:1到“ws://localhost:55555/

  • 我正在Windows Server 2008 R2上运行一个使用IIS 7.5的小网站。我有一个节点。js应用程序也在3000端口上运行。 来自网站(客户端浏览器)的Http调用从至。到目前为止一切正常。 问题是当我尝试使用套接字时。伊奥。 我正在接收: 如果我没有猜错的话,我很肯定: 它确实会将初始请求转发到我的服务器,因为对websocket服务器的初始请求是一个标准HTTP请求(带有一些附加

  • 错误:无法启动连接:错误:WebSocket无法连接。在服务器上找不到连接,endpoint可能不是信号器endpoint,服务器上不存在连接ID,或者存在阻止WebSocket的代理。如果有多台服务器,请检查是否启用了粘性会话。 WebSocketTransport.js:49WebSocket连接到“ws://xxxxxx/生产/网络服务/集线器/spreadhub”失败: Angular.t

  • 我正在使用Python的套接字来响应Websocket请求,并且我面临着头的问题。以前可能有过类似的问题,但没有人为我工作 文档位于https://developer.mozilla.org声明对于要建立的连接: 服务器获取握手请求中发送的Sec-WebSocket-Key的值,追加258EAFA5-E914-47DA-95CA-C5AB0DC85B11,获取新值的SHA-1,然后对其进行Bas6

  • 问题内容: 我使用NodeJS创建了一个应用程序,并且正在使用ws模块。如果我在本地主机上测试该应用程序,则它可以正常工作,并且连接websockets没有任何问题。现在,我已将应用程序上载到Openshift,当我尝试从客户端访问该应用程序时,它返回,这无法建立与Websocket的连接。 如果我在应用程序中拖入腻子, 则会收到 以下消息: 调试:这种类型的响应一定不能有主体。 忽略传递给end