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

时间:2019-06-13 04:42:54

标签: laravel-5 websocket apache2 azure-web-sites phpwebsocket

我想在具有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时,使用HTTP获得“连接套接字错误”,使用SSL时出现“ SSL错误”。我相当确定该请求至少已到达计算机,就像我关闭WebSocket服务器一样,错误变为503 Service not available。另外,我可以看到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,
    ]
...

这是broadcast.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中的回声定义(由软件包文档建议):

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 个答案:

答案 0 :(得分:0)

好的,这个问题终于解决了!这样做的方法是将单独的服务器(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上连接,则需要禁用验证对等方,请查看Laravel-Websockets文档中有关Laravel Velvet的部分以了解更多详细信息(即使您不使用Laravel Velvet)