这是双重WebSocket代理的问题。用户在到达目的地之前要经过两台Apache服务器。
总结目标(其中“ X”是整数,例如[0-9] +):
wss://Server1/X/websocket
,该访问转发到ws://Server2/X/websocket
/X/websocket
重定向到其他目的地,例如/5/websocket
到达一个目的地,/40/websocket
到达另一个目的地。问题
ws://Server2:80/5/websocket
是可行的,但是wss://Server1/5/websocket
无效。以这种方式访问Server1时,Server2会引发错误(error.log):AH01144: No protocol handler was valid for the URL /5/websocket (scheme 'ws'). If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
此错误令人困惑,因为直接访问Server2即可,并且所有必需的模块都已加载到服务器2:
# apache2ctl -M | grep proxy
proxy_module (shared)
proxy_balancer_module (shared)
proxy_http_module (shared)
proxy_wstunnel_module (shared)
Server1还具有其他可以正常工作的WebSocket代理,因此,似乎该问题与使用环境变量的方式之间的交互或使用环境变量时如何传递路由路径/报头有关。请参阅下面的“ ROUTE”变量...
第一个Apache2配置为:
<Location /([^;]*)/websocket>
ProxyPreserveHost On
SetEnv ROUTE $1
Order allow,deny
Allow from all
ProxyPassMatch ws://somemachine:80/%{ROUTE}/websocket
ProxyPassReverse ws://somemachine:80/%{ROUTE}/websocket
</Location>
第二台服务器(运行在somemachine:80上)具有以下内容:
<Location /5/websocket>
ProxyPreserveHost On
Order allow,deny
Allow from all
ProxyPass ws://destinationFor5:80/websocket
ProxyPassReverse ws://destinationFor5:80/websocket
</Location>
.... more locations follow with a similar pattern
有趣的是,相同类型的配置,但是对于HTTP而不是ws,似乎工作正常。