提问者:小点点

Laravel-webSocket无法通过apache2连接到Azure VM


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

此VM只允许通过80和443进入。因此,我做了反向代理,将“/WebSocket”重定向到http://127.0.0.1:6001(其中WebSocket运行.TCP)服务器使用https。我试图修改服务器。conf文件无效。我已经尝试启用/禁用SSL并进行了加密。我试图直接访问127.0。0.1:6001在使用eLink的VM中,但使用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' => [
            '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-den-name和443(webSocket仍在6001上运行)。

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

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控制台在听众订阅广播频道后立即做出反应。


共1个答案

匿名用户

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

看起来设置必须在https上,否则WebSocket服务器无法从后端接收响应。另外,我遇到了一个奇怪的问题,在那里推。vendor/pusher/pusher-php服务器中的php缺少大约400行代码,尽管它与我的本地实现具有相同的包版本(~3.0),但也缺少其他几个文件。如果您在WebSocket服务器接收广播事件时得到对undefined方法的调用,这可能就是原因。如果您无法在Chrome上连接到websocket,但在firefox上可以,则需要禁用验证对等点,请查看Laravel websocket文档中关于Laravel Velvet的部分以了解更多详细信息(即使您不使用Laravel Velvet)