Ssl

Apache mod_proxy:將安全 websocket 轉發到非安全

  • September 30, 2016

我依賴的 websocket 庫 ( PHP-Websockets ) 還不支持安全套接字 ( wss)。不過,我的網站服務已結束https,因此我不能使用不安全ws的連接。

我正在嘗試使用Apachemod_proxy將來自瀏覽器的安全請求轉發到客戶端。

Javascript

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

阿帕奇虛擬主機

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.cmod_proxy.cmod_proxy_http.c

Apache 2.4

為了讓事情正常工作,我還需要載入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>

然後瀏覽器可以通過 HTTPS 埠聯繫後端 WS 伺服器:

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

引用自:https://serverfault.com/questions/804862