【发布时间】: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