.htaccess для доступа к WebSocket-серверу через wss://

Вопрос или проблема

Я использую Yjs для создания совместного редактора. Это включает в себя запуск небольшого, довольно простого сервера сигнализации WebSockets с использованием Node.js. Исходный код сервера находится здесь.

Я запускаю сервер сигнализации с PORT=12201 и пытаюсь подключиться к серверу сигнализации из моего приложения через wss://<имя-моего-сервера>:12201.

В браузерах Chrome и Firefox я получаю ошибку: “Не удалось установить WebSocket соединение с ‘wss://<имя-моего-сервера>:12201/'”.

Однако, если я изменяю на ws:// и запускаю моё приложение с локального хоста, оно подключается без проблем. Проблема заключается в том, что HTTPS страница не может установить незащищённое (ws://) соединение, ей необходимо сделать защищённое (wss://).

В исходном коде сервера видно, что соединение инициируется как обычный, незашифрованный WebSocket. Теперь, я могу потенциально добавить информацию о сертификате на сервер и начать соединение безопасно, но (а) у меня нет сертификата, так как я в настоящее время использую Lets Encrypt на DreamHost и у меня нет доступа к нему; и (б) мне посоветовали, что лучше позволить серверу или прокси обрабатывать шифрование, чем добавлять информацию о сертификате непосредственно на сервер.

После многочисленных поисков в Google, кажется, есть похожие вопросы о подключении wss:// к серверу ws:// через .htaccess. Поэтому, предполагая, что я могу заставить это работать, я пробовал несколько комбинаций, в основном вариации на тему:

RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule /(.*) ws://127.0.0.1:12201/$1 [P,L]

Но это всё ещё не работает.

Есть ли способ сделать то, что я пытаюсь сделать, т.е. как-то позволить Apache обрабатывать SSL для соединения ws:// (т.е. сделать его wss://), или я заблуждаюсь?

Ответ или решение

Для решения вашей проблемы с подключением к WebSocket-серверу через wss:// с использованием Apache, вам потребуется настроить проксирование запросов WebSocket через .htaccess. Это позволит вашему веб-серверу обрабатывать TLS (SSL) и перенаправлять трафик на WebSocket-сервер, который работает на ws://.

Вот шаги, которые необходимо выполнить:

  1. Убедитесь, что у вас включены необходимые модули Apache: Вам нужно убедиться, что модули mod_proxy, mod_proxy_http, mod_proxy_wstunnel и mod_rewrite включены. Вы можете сделать это в конфигурации вашего Apache, добавив следующие строки, если они еще не включены:

    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
    LoadModule rewrite_module modules/mod_rewrite.so
  2. Настройка .htaccess: Добавьте следующий код в ваш файл .htaccess, который должен находиться в корневой директории вашего веб-приложения:

    RewriteEngine On
    
    # Прокси для запросов WebSocket
    RewriteCond %{HTTP:Connection} Upgrade [NC]
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteRule ^/ws/(.*) ws://127.0.0.1:12201/$1 [P,L]
    
    # Прокси для других HTTP-запросов
    RewriteRule ^/(.*) http://127.0.0.1:YOUR_HTTP_PORT/$1 [P,L]

    Обратите внимание, что в RewriteRule вам нужно заменить YOUR_HTTP_PORT на порт, на котором работает ваше HTTP-приложение.

  3. Настройка вашего WebSocket-сервера: Убедитесь, что ваш WebSocket-сервер действительно прослушивает ws://127.0.0.1:12201. Если он запущен на другом порту или IP-адресе, замените 127.0.0.1 и порт на соответствующие значения.

  4. Проверка разрешений: Убедитесь, что у вас есть соответствующие права на использование и редактирование файла .htaccess, а также что настройки Apache позволяют использование .htaccess.

  5. Тестирование: После внесения изменений и перезапуска Apache протестируйте подключение к вашему серверу WebSocket, используя wss://<my-server-name>/ws/, где <my-server-name> — это имя вашего сервера.

  6. Дебаггинг: Если возникнут проблемы, проверьте логи Apache на наличие ошибок. Это может помочь вам определить, где именно происходит сбой в процессе проксирования.

Эти шаги должны помочь вам наладить безопасное подключение к вашему WebSocket-серверу через wss:// и позволят вашему приложению успешно работать в среде HTTPS.

Оцените материал
Добавить комментарий

Капча загружается...