gpt4 book ai didi

nginx - Ratchet 没有从浏览器接收到 WebSocket 数据包?

转载 作者:行者123 更新时间:2023-12-04 16:14:27 26 4
gpt4 key购买 nike

我正在尝试使用 Ratchet 使用 WebSockets 测试简单的 ping & pong 响应。我的 WebSocket 服务器是 不是 查看来自我的 Web 浏览器的 WebSocket 客户端的任何响应 但是 浏览器可以很好地看到 WebSocket 服务器发送的数据包。我试图找出原因。

我目前的猜测是:

  • 我缺少一些 HTTP header
  • 我必须在浏览器上对数据包进行编码 wsclient.send(encodeFrame("{'action': 'pong'}"));
  • CloudFlare 未将 WS 流中的数据包识别为有效并对其进行处理
  • EC2 实例中的 CloudFlare 或 nginx 正在做一些奇怪的缓冲
  • Ratchet 无法识别最低 IOServer 级别的数据包并对其进行处理
  • 但我从来没有从这个级别收到任何错误或异常

  • 设置:
  • Linux 服务器 @ Amazon EC2
  • DNS @ CloudFlare 提供免费计划和加速 + 强制 HTTPS 重定向
  • HTTP 服务器是 nginx
  • nginx 上没有 HTTPS(Cloudflare 重定向 HTTPS -> EC2 HTTP)
  • 运行在 127.0.0.1:65000 的 WebSocket 服务器(Ratchet)在 EC2
  • Nginx 重定向 /api127.0.0.1:65000 ( Ratchet )

  • 在 EC2 实例上使用自己的 WebSocket 客户端进行测试:
  • 127.0.0.1:65000工作正常
  • <Amazon NAT IP of instance>:80工作正常
  • <Amazon public IP of instance>:80工作正常
  • <CloudFlare IP of Amazon public IP>:80在应用程序实现级别连接到 WebSocket 服务器,但在 onMessage 上看不到数据包任何级别的方法(App、WsServer、HTTPServer)
  • <CloudFlare IP of Amazon public IP>:443400 Bad Request因为测试客户端只是简单的 TCP 流

  • 从本地机器测试:

    直接连接到由 CloudFlare 的缓存 IP 提供的主机。 Dojox.Socket 连接到 wss://host/api .在 Ratchet 的应用程序实现级别再次看到连接( onOpen 被触发)。我的浏览器看到 ping数据包很好,所以从 Ratchet 发送工作正常。

    但后来我尝试发送 pong回复 ping来自浏览器和 onMessage Ratched 上的任何级别都不会触发方法。连接保持打开状态,如果我用 Fiddler 观看,ping 和 pong 都会不断发送,但 WebSocket 服务器永远不会收到这些 pong ( onMessage )。

    跟随 Fiddler 的 WebSocket 流显示来自浏览器的 pongs 具有“Data masked by key: <some hex>”,但来自 Ratched 的 pings 是 不是 蒙面。

    连接摘要:

    页面加载:

    本地机 http://host/ → CloudFlare HTTPS 重定向 https://host/http://host-with-amazon-public-ip/http://host-with-amazon-NAT-ip/ → 将 wss WebSocket 连接加载到 /api 的 HTML + JS 页面

    WebSocket 连接到 /api :

    CloudFlare HTTPS 重定向 wss://host/api → http://host-with-amazon-public-ip/apihttp://host-with-amazon-NAT-ip/api → 本地服务器 nginx 重定向/api → 127.0.0.1:65000 → 连接升级 → WebSocket 流 → Web 浏览器的 WebSocket 流

    配置文件
    server {
    listen 80;

    server_name test.example.com;
    root /home/raspi/test/public;
    autoindex off;
    index index.php;

    access_log /home/raspi/test/http-access.log;
    error_log /home/raspi/test/http-error.log notice;

    location / {
    index index.php;
    try_files $uri $uri/ /index.php?$args;
    }

    location /api {
    access_log /home/raspi/test/api-access.log;
    error_log /home/raspi/test/api-error.log;

    expires epoch;

    proxy_ignore_client_abort on;
    proxy_buffering off;
    proxy_request_buffering off;
    proxy_cache off;
    proxy_pass http://127.0.0.1:65000/;

    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header Connection "keep-alive, Upgrade";
    proxy_set_header Upgrade "websocket";
    proxy_set_header Accept-Encoding "gzip, deflate";
    proxy_set_header Sec-WebSocket-Extensions "permessage-deflate";
    proxy_set_header Sec-WebSocket-Protocol "game";
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location ^~ /js/app/ {
    try_files $uri /;
    expires epoch;
    add_header Cache-Control "no-cache" always;
    }

    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ {
    try_files $uri /;
    access_log off;
    expires max;
    }

    location = /robots.txt { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }
    location ~ /\. { access_log off; log_not_found off; deny all; }

    location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }

    最佳答案

    Web 套接字目前仅在业务和企业级别可用。您提到您使用的是免费计划。这就是这里的问题。

    关于nginx - Ratchet 没有从浏览器接收到 WebSocket 数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33414354/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com