web-dev-qa-db-ja.com

同じURLでのApache2WebSocketリバースプロキシ

同じURLで行われ、ヘッダー「Upgrade:websocket」とURLスキーマws://だけが異なる場合に、Apache2をプロキシWebSocket接続(たとえばBrowserSync)に構成する方法は?

例えば:

HTTP request:
GET http://example.com/browser-sync/socket.io/?... HTTP/1.1
...

WebSocket request:
GET ws://example.com/browser-sync/socket.io/?... HTTP/1.1
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
...

私が見つけたすべての例では、「<Location/ws> ...」や「ProxyPass/ws /ws://example.com/」などの一部のパスのみをリダイレクトします

私の現在の設定:

ProxyRequests off
<Location />
    ProxyPass http://127.0.0.1:3000/
    ProxyPassReverse /
</Location>

mod_proxy、mod_proxy_http、mod_proxy_wstunnelが有効になっています。

11
metalim

自分に答える。

RewriteEngineを使用して、 この投稿 で与えられたヒント、およびWebSocketハンドシェイク仕様:

RewriteEngine On
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule /(.*) ws://127.0.0.1:3000/$1 [P,L]

ProxyRequests off
<Location />
    ProxyPass http://127.0.0.1:3000/
    ProxyPassReverse /
</Location>
24
metalim

メタリムに感謝します!参考までに、完全な構成をここに公開します。

<VirtualHost *>
    ServerName example.org
    ServerAlias *.example.org
    ServerAdmin [email protected]
    ProxyRequests Off
    ProxyPreserveHost On

    RewriteEngine On
    RewriteCond %{HTTP:Connection} Upgrade [NC]
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteRule /(.*) ws://192.168.1.1/$1  [P,L]

    ProxyPass / http://192.168.1.1/ retry=1
    ProxyPassReverse / http://192.168.1.1/

    ErrorLog /var/log/Apache2/example.org.error.log
    CustomLog /var/log/Apache2/example.org.access.log combined
</VirtualHost>
1
Ivan Ermilov