Laravel-websocket не может подключиться к виртуальной машине Azure через apache2 - PullRequest
0 голосов
/ 13 июня 2019

Я хочу реализовать 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 немедленно отреагирует каккак только слушатель подпишется на канал вещания.

1 Ответ

0 голосов
/ 26 июня 2019

ОК, эта проблема наконец решена! Способ сделать это - настроить отдельный сервер (https) в качестве выделенного сервера WebSocket. Пожалуйста, следуйте этому руководству: https://42coders.com/setup-beyondcode-laravel-websockets-with-laravel-forge/

Похоже, что параметр должен быть на https, или сервер WebSocket не может получить ответ от бэкэнда. Кроме того, я столкнулся со странной проблемой, когда Pusher.php в vendor / pusher / pusher-php-server пропускает около 400 строк кода, некоторые другие файлы также отсутствуют, несмотря на то, что он имеет ту же версию этого пакета (~ 3.0), что и мой локальный реализация. Если вы получаете call to undefined method, когда сервер WebSocket получает широковещательное событие, это, вероятно, является причиной. Если вы не можете подключиться к веб-сокету в Chrome, но можете в Firefox, вам нужно отключить проверки-пиров, пожалуйста, проверьте раздел Laravel Velvet в документе Laravel-Websockets для более подробной информации (даже если вы не используете Laravel Velvet)

...