Вопрос или проблема
Я использую 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://
.
Вот шаги, которые необходимо выполнить:
-
Убедитесь, что у вас включены необходимые модули 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
-
Настройка .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-приложение. -
Настройка вашего WebSocket-сервера: Убедитесь, что ваш WebSocket-сервер действительно прослушивает
ws://127.0.0.1:12201
. Если он запущен на другом порту или IP-адресе, замените127.0.0.1
и порт на соответствующие значения. -
Проверка разрешений: Убедитесь, что у вас есть соответствующие права на использование и редактирование файла
.htaccess
, а также что настройки Apache позволяют использование.htaccess
. -
Тестирование: После внесения изменений и перезапуска Apache протестируйте подключение к вашему серверу WebSocket, используя
wss://<my-server-name>/ws/
, где<my-server-name>
— это имя вашего сервера. -
Дебаггинг: Если возникнут проблемы, проверьте логи Apache на наличие ошибок. Это может помочь вам определить, где именно происходит сбой в процессе проксирования.
Эти шаги должны помочь вам наладить безопасное подключение к вашему WebSocket-серверу через wss://
и позволят вашему приложению успешно работать в среде HTTPS.