Назад | Перейти на главную страницу

Apache mod_proxy: пересылка защищенного веб-сокета на незащищенный

Библиотека веб-сокетов, на которую я полагаюсь (PHP-веб-сокеты) еще не поддерживает безопасные сокеты (wss). Мой сайт обслуживается https хотя, поэтому я не могу использовать небезопасный ws соединения.

Я пытаюсь использовать Apache's mod_proxy для пересылки защищенного запроса, поступающего от браузера, клиенту.

Javascript

var ws = new Websocket('wss://example.com/_ws_/');

Apache VirtualHosts

ProxyPass        "/_ws_/" "ws://127.0.0.1:8080/"
ProxyPassReverse "/_ws_/" "ws://127.0.0.1:8080/"
# I've also tried "/_ws_/" "ws://example.com:8080/"  Same error below

При попытке подключения браузер получает сообщение 500 Server Error. Журналы показывают:

Для URL / _ws_ / не действовал обработчик протокола. Если вы используете DSO-версию mod_proxy, убедитесь, что подмодули прокси включены в конфигурацию с помощью LoadModule.

Я подтвердил, что если я удалю правила прокси, перестанет перенаправлять пользователей на https и попробуйте подключиться к незащищенным сокетам из браузера: new Websocket('ws://example.com/'), все работает нормально.

Мои загруженные модули Apache включают mod_ssl.c, mod_proxy.c и mod_proxy_http.c

Apache 2.4

Чтобы все заработало, мне также нужно было загрузить mod_proxy_wstunnel

Как только я это сделал, этот набор правил начал работать: (в VirtualHost домена, который получает и передает запрос веб-сокета)

<IfModule mod_proxy.c>
    ProxyPass "/_ws_/" "ws://127.0.0.1:8080/"
    ProxyPassReverse "/_ws_/" "ws://127.0.0.1:8080/"
</IfModule>

Затем браузер может связаться с внутренним сервером WS через порт HTTPS:

var ws = new Websocket('wss://example.com/_ws_/');