【问题标题】:Laravel-websocket can't connect to Azure VM through apache2Laravel-websocket 无法通过 apache2 连接到 Azure VM
【发布时间】:2019-10-27 15:13:01
【问题描述】:

我想在带有 apache2 反向代理的 Azure VM 上使用 Laravel-echo 实现 Laravel-WebSocket + 推送器替代 (https://github.com/beyondcode/laravel-websockets)。但是,无论我尝试什么,它们都无法连接。当客户端侦听器尝试连接时,它总是在错误 404、502 和 500 之间。

这个VM只允许通过80和443进入。因此,我做了反向代理,将'/WebSocket'重定向到http://127.0.0.1:6001(WebSocket运行的地方。TCP)服务器在https下。我试图修改服务器 .conf 文件无济于事。我也尝试启用/禁用 SSL 和加密。我尝试使用 elinks 直接访问 VM 中的 127.0.0.1:6001,但是使用 http 我得到“错误连接到套接字”,使用 https 我得到“SSL 错误”。我相当确定该请求至少到达了机器,就好像我关闭了 WebSocket 服务器错误更改为 503 服务不可用一样。此外,我可以在发出请求时看到 apache2 错误日志。大多数时候是 502 代理错误。 (AH01102:从远程服务器 127.0.0.1:6001 读取状态行时出错)如果我调整 SSL 设置,它通常会更改为 404,在这种情况下,我将其视为证书/密钥不正确的标志。防火墙已打开。

我已经尝试了所有我能找到的指南。其中大部分是关于 nginx 的,我无法更改。如果可能的话,我宁愿不设置另一个虚拟主机。

这是在 websocket.php 中:

....
'apps' => [
        [
            'id' => env('PUSHER_APP_ID'),
            'name' => env('APP_NAME'),
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'enable_client_messages' => false,
            'enable_statistics' => true,
        ],
    ]
....
'ssl' => [
        'local_cert' => 'my_self_signed_cert.pem',
        'local_pk' => 'my_key.pem',
        'passphrase' => null,
    ]
...

这是broadcasting.php中的pusher设置:

...
        'pusher' => [
            'driver' => 'pusher',
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'app_id' => env('PUSHER_APP_ID'),
            'options' => [
                'cluster' => env('PUSHER_APP_CLUSTER'),
                'host' => env('PUSHER_APP_HOST'), 
                'port' => env('PUSHER_APP_PORT'),
                'scheme' => 'https',
                'encrypted' => true,
            ],
        ]
...

我尝试将 127.0.0.1 作为主机,将 6001 作为默认端口,然后我按照以下指南:https://42coders.com/setup-beyondcode-laravel-websockets-with-laravel-forge/ 并将它们分别更改为 my-domain-name 和 443(websocket 仍在 6001 上运行)。

这是 /resources/js/bootstrap.js 中的 echo 定义(由包文档建议):

import Echo from "laravel-echo";

window.Pusher = require("pusher-js");

window.Echo = new Echo({
    broadcaster: "pusher",
    key: "my-pusher-key",
    wsHost: window.location.hostname + '/websocket',
    wsPort:443,
    disableStats: true,
});

这是 apache2 设置:

<VirtualHost *:443>
    ServerName my_server_name
    RequestHeader unset x-forwarded-host
    ...
    SSLEngine on
    SSLCertificateFile my-self-cert
    SSLCertificateKeyFile my-key
    SSLProxyEngine on
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off
    ProxyPreserveHost On
    <Location /websocket>
        ProxyPass "http://127.0.0.1:6001" Keepalive=On
        ProxyPassReverse "http://127.0.0.1:6001"
    </Location>
    ...
    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} websocket [NC]
    RewriteCond %{HTTP:CONNECTION} Upgrade [NC]
    RewriteRule /(.*) http://127.0.0.1:6001/$1 [P,L]
    ProxyRequests Off
</VirtualHost>

将 http 更改为 ws 或 wss 将触发错误“没有有效的协议处理程序”,尽管我已经包含了 wstunnel 模块。

我希望 WebSocket 控制台在侦听器订阅广播频道后立即做出反应。

【问题讨论】:

    标签: laravel-5 websocket apache2 azure-web-app-service phpwebsocket


    【解决方案1】:

    好的,这个问题终于解决了!这样做的方法是将单独的服务器(https)设置为专用的 WebSocket 服务器。请遵循本指南: https://42coders.com/setup-beyondcode-laravel-websockets-with-laravel-forge/

    看起来设置必须在 https 上,否则 WebSocket 服务器无法接收来自后端的响应。另外,我遇​​到了一个奇怪的问题,即 vendor/pusher/pusher-php-server 中的 Pusher.php 丢失了大约 400 行代码,尽管它与我的本地包的版本相同(~3.0),但其他几个文件也丢失了执行。如果您在 WebSocket 服务器接收到广播事件时收到call to undefined method,这很可能是原因。如果在 Chrome 上无法连接到 websocket,但在 firefox 上可以,则需要禁用 verify-peers,请查看 Laravel-Websockets 文档中关于 Laravel Velvet 的部分了解更多详细信息(即使你不使用Laravel 天鹅绒)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 2016-08-22
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      相关资源
      最近更新 更多