首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel-websocket无法通过apache2连接到Azure VM

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

Stack Overflow用户
提问于 2019-06-13 12:42:55
回答 1查看 1K关注 0票数 1

我想在一个带有apache2反向代理的Azure虚拟机上实现Laravel-WebSocket + pusher reverse (https://github.com/beyondcode/laravel-websockets)和Laravel-echo。然而,无论我怎么尝试,他们就是不能连接。当客户端监听器尝试连接时,总是在错误404、502和500之间。

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

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

这是在websocket.php中:

代码语言:javascript
运行
复制
....
'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中的推送器设置:

代码语言:javascript
运行
复制
...
        '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定义(由软件包文档建议):

代码语言:javascript
运行
复制
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设置:

代码语言:javascript
运行
复制
<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将触发错误'No protocol handler was valid',尽管我已经包含了wstunnel模块。

我希望在监听程序订阅广播频道后,WebSocket控制台立即做出反应。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-26 09:36:26

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56573485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档