Laravel-websocket 无法通过 apache2 连接到 Azure VM
Laravel-websocket can't connect to Azure VM through apache2
我想在具有 apache2 反向代理的 Azure VM 上使用 Laravel-echo 实施 Laravel-WebSocket + 推送器替代 (https://github.com/beyondcode/laravel-websockets)。但是,无论我尝试什么,他们就是无法连接。当客户端侦听器尝试连接时,它总是在错误 404、502 和 500 之间。
此虚拟机只允许通过 80 和 443 进入。因此,我做了反向代理,将 '/WebSocket' 重定向到 http://127.0.0.1:6001(WebSocket 运行的位置。TCP)服务器在 https 下。我试图修改服务器 .conf 文件无济于事。我也尝试过 enable/disable SSL 和加密。我尝试使用 elinks 在 VM 中直接访问 127.0.0.1:6001,但是使用 http 我得到 'error connecting to socket',使用 https 我得到 'SSL error'。我相当确定请求至少到达了机器,就好像我关闭了 WebSocket 服务器一样,错误变为 503 服务不可用。此外,我可以在发出请求时看到 apache2 错误日志。大多数时候是 502 代理错误。 (AH01102:从远程服务器 127.0.0.1:6001 读取状态行时出错)如果我调整 SSL 设置,它通常会更改为 404,在这种情况下我将其视为 certificate/key 不正确的标志。防火墙是打开的。
我已经尝试了我能找到的所有指南。大部分都是关于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/ 将它们分别更改为我的域名和 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/ [P,L]
ProxyRequests Off
</VirtualHost>
将 http 更改为 ws 或 wss 将触发错误 'No protocol handler was valid',尽管我已经包含了 wstunnel 模块。
我希望 WebSocket 控制台在侦听器订阅广播频道后立即做出反应。
好的,这个问题终于解决了!实现的方法是设置一个单独的服务器(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 Velvet)
我想在具有 apache2 反向代理的 Azure VM 上使用 Laravel-echo 实施 Laravel-WebSocket + 推送器替代 (https://github.com/beyondcode/laravel-websockets)。但是,无论我尝试什么,他们就是无法连接。当客户端侦听器尝试连接时,它总是在错误 404、502 和 500 之间。
此虚拟机只允许通过 80 和 443 进入。因此,我做了反向代理,将 '/WebSocket' 重定向到 http://127.0.0.1:6001(WebSocket 运行的位置。TCP)服务器在 https 下。我试图修改服务器 .conf 文件无济于事。我也尝试过 enable/disable SSL 和加密。我尝试使用 elinks 在 VM 中直接访问 127.0.0.1:6001,但是使用 http 我得到 'error connecting to socket',使用 https 我得到 'SSL error'。我相当确定请求至少到达了机器,就好像我关闭了 WebSocket 服务器一样,错误变为 503 服务不可用。此外,我可以在发出请求时看到 apache2 错误日志。大多数时候是 502 代理错误。 (AH01102:从远程服务器 127.0.0.1:6001 读取状态行时出错)如果我调整 SSL 设置,它通常会更改为 404,在这种情况下我将其视为 certificate/key 不正确的标志。防火墙是打开的。
我已经尝试了我能找到的所有指南。大部分都是关于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/ 将它们分别更改为我的域名和 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/ [P,L]
ProxyRequests Off
</VirtualHost>
将 http 更改为 ws 或 wss 将触发错误 'No protocol handler was valid',尽管我已经包含了 wstunnel 模块。
我希望 WebSocket 控制台在侦听器订阅广播频道后立即做出反应。
好的,这个问题终于解决了!实现的方法是设置一个单独的服务器(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 Velvet)