Я хочу реализовать Laravel-WebSocket + заменитель толкателя (https://github.com/beyondcode/laravel-websockets) с Laravel-echo на виртуальной машине Azure с обратным прокси-сервером apache2. Однако, что бы я ни пытался, они просто не могут подключиться. Это всегдамежду ошибками 404, 502 и 500, когда клиентский прослушиватель пытается подключиться.
Эта виртуальная машина разрешает вход только через 80 и 443. Поэтому я сделал обратный прокси-сервер, который перенаправляет '/ WebSocket' на http://127.0.0.1:6001 (там, где работает WebSocket. TCP) Сервер находится под https. Я пытался изменить файл .conf сервера, но безрезультатно. Я пытался включить / отключить SSL и шифровал. Я пытался получить прямой доступ к 127.0.0.1: 6001 внутри виртуальной машины, используя elinks, но с http я получил «ошибку при подключении к сокету», а с https я получил «ошибку SSL». Я уверен, что запрос по крайней мере достиг машины, как если бы я выключилНа сервере WebSocket ошибка меняется на 503. Сервис недоступен. Кроме того, я вижу журналы ошибок apache2 как запросы, которые выполняются. В большинстве случаев это ошибка прокси-сервера 502. (AH01102: errили чтение строки состояния с удаленного сервера 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-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 немедленно отреагирует каккак только слушатель подпишется на канал вещания.