web-dev-qa-db-ja.com

Apache mod_proxy:セキュアなWebSocketを非セキュアに転送

私が依存しているwebsocketライブラリ( PHP-Websockets )は、まだ安全なソケット(wss)をサポートしていません。私のウェブサイトはhttps経由で提供されているため、安全でないws接続を使用できません。

私は Apacheの_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_ /に対して有効なプロトコルハンドラはありませんでした。 mod_proxyのDSOバージョンを使用している場合は、プロキシサブモジュールがLoadModuleを使用した構成に含まれていることを確認してください。

プロキシルールを削除して、ユーザーをhttpsにリダイレクトするのをやめ、ブラウザから安全でないソケットに接続しようとすると、確認しました:new Websocket('ws://example.com/')、問題なく動作します。

ロードしたApacheモジュールには、_mod_ssl.c_、_mod_proxy.c_、および_mod_proxy_http.c_が含まれます

_Apache 2.4_

6
BeetleJuice

物事を機能させるには、 mod_proxy_wstunnel

私がやると、このルールセットは機能しました:(websocketリクエストを受信して​​プロキシするドメインのVirtualHost内)

<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_/');
9
BeetleJuice