Apache mod_proxy:将安全 websocket 转发到非安全

Bee*_*ice 7 ssl mod-proxy apache-2.4 websocket

我依赖的 websocket 库 ( PHP-Websockets ) 尚不支持安全套接字 ( wss)。不过我的网站已经结束https,所以我不能使用不安全的ws连接。

我正在尝试使用Apachemod_proxy将来自浏览器的安全请求转发到客户端。

Javascript

var ws = new Websocket('wss://example.com/_ws_/');
Run Code Online (Sandbox Code Playgroud)

Apache 虚拟主机

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
Run Code Online (Sandbox Code Playgroud)

尝试连接时,浏览器会收到一个500 Server Error. 日志显示:

没有协议处理程序对 URL /_ws_/ 有效。如果您使用的是 mod_proxy 的 DSO 版本,请确保使用 LoadModule 将代理子模块包含在配置中。

我已经确认,如果我删除代理规则,停止将用户重定向到https并尝试从浏览器连接到不安全的套接字:new Websocket('ws://example.com/'),一切正常。

我加载的 Apache 模块包括mod_ssl.c,mod_proxy.cmod_proxy_http.c

Apache 2.4

Bee*_*ice 9

为了让事情工作,我还需要加载 mod_proxy_wstunnel

一旦我这样做了,这个规则集就开始工作了:(在VirtualHost接收和代理 websocket 请求的域中)

<IfModule mod_proxy.c>
    ProxyPass "/_ws_/" "ws://127.0.0.1:8080/"
    ProxyPassReverse "/_ws_/" "ws://127.0.0.1:8080/"
</IfModule>
Run Code Online (Sandbox Code Playgroud)

然后浏览器可以通过 HTTPS 端口联系后端 WS 服务器:

var ws = new Websocket('wss://example.com/_ws_/');
Run Code Online (Sandbox Code Playgroud)