我正在尝试使用mod_proxy_wstunnel将Apache 2.4configuration为将socket.io的websocket连接代理到node.js websocket服务器。 我们使用socket.io 0.9可以正常工作,但是在1.0发行版中,它们将套接字端点更改为查询参数,现在我在使用正确的代理指令configurationapache时遇到了问题。
所有对/socket.io/?EIO=N&transport=websocket (其中N是任何数字,通常为2)的请求都需要被转发到ws://localhost:8082/socket.io/ ,但是所有其他的请求都需要被转发到http://localhost:8082/socket.io/ 。
我试过以下两种configuration的变体:
ProxyPass /socket.io/?EIO=2&transport=websocket http://localhost:8082/socket.io/?EIO=2&transport=websocket ProxyPassReverse /socket.io/?EIO=2&transport=websocket http://localhost:8082/socket.io/?EIO=2&transport=websocket ProxyPass /socket.io/ http://localhost:8082/socket.io/ ProxyPassReverse /socket.io/ http://localhost:8082/socket.io/
。
RewriteRule /socket.io/?EIO=([0-9]+)&transport=websocket ws://localhost:8082/socket.io/ [QSA,P] ProxyPass /socket.io/ http://localhost:8082/socket.io/ ProxyPassReverse /socket.io/ http://localhost:8082/socket.io/
我从search结果中发现,ProxyPass和Locations不能定位查询string,那么在这里还有其他的select吗? path被硬编码到socket.io中,所以分叉整个库的时候我无法改变它们。
使用重写条件来匹配这个特殊情况:
RewriteEngine On RewriteCond %{REQUEST_URI} ^/socket.io [NC] RewriteCond %{QUERY_STRING} transport=websocket [NC] RewriteRule /(.*) ws://localhost:8082/$1 [P,L] ProxyPass /socket.io http://localhost:8082/socket.io ProxyPassReverse /socket.io http://localhost:8082/socket.io
注意Mark W在下面注明。 这些必须在虚拟主机级别input,而不是在服务器或.htaccess级别input。 很容易错过这个要求,浪费时间,因为Mark W的评论在默认情况下不再显示。
您也可以参考平衡器:
<Proxy balancer://http-localhost/> BalancerMember http://localhost:8082 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900 BalancerMember http://localhost:8083 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900 ProxySet lbmethod=bytraffic </Proxy> <Proxy balancer://ws-localhost/> BalancerMember ws://localhost:8082 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900 BalancerMember ws://localhost:8083 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900 ProxySet lbmethod=bytraffic </Proxy> RewriteEngine On RewriteCond %{REQUEST_URI} ^/socket.io [NC] RewriteCond %{QUERY_STRING} transport=websocket [NC] RewriteRule /(.*) balancer://ws-localhost/$1 [P,L] ProxyPass /socket.io balancer://http-localhost/socket.io ProxyPassReverse /socket.io balancer://http-localhost/socket.io