我有一个Apache代理用于Meteor应用程序,而Apache和Meteor位于两台不同的机器上。我需要这样做是因为Apache必须服务于许多真实的网站,如果在此机器上安装Meteor应用程序会因其资源有限而不明智。
然而,如果我尝试通过代理从外部连接时,WebSocket握手将失败,响应代码为400“仅能升级到WebSocket”。当我直接从局域网连接到Meteor机器时,一切正常。
当WebSocket失败时,SockJS/Meteor会回退到XHR,但不幸的是,这会引起所涉及的应用程序中的一些错误。因此,在大多数情况下,我真的需要WebSocket正常工作。
我使用此处提到的补丁修复了我的Apache安装:https://dev59.com/kWYq5IYBdhLWcg3weQgy#16998664。看起来进展顺利,但没有任何改变...
我的Apache代理指令目前如下:
因此,“升级”被删除,“连接”被改变,因此Websocket握手失败。现在,我可以尝试使用RequestHeader指令将“Upgrade”始终设置为“websocket”。但是这不太对,我猜这会带来其他问题,因此我想知道是否有真正的解决方案?或者这是https://dev59.com/kWYq5IYBdhLWcg3weQgy#16998664补丁应该解决的问题,但我的应用出了问题?
根据我所读的,切换到nginx可能会使这种设置更容易。我会考虑这个建议,但如果可能的话,我想使用apache,因为nginx会使其他事情更加复杂并花费我很多时间。
然而,如果我尝试通过代理从外部连接时,WebSocket握手将失败,响应代码为400“仅能升级到WebSocket”。当我直接从局域网连接到Meteor机器时,一切正常。
当WebSocket失败时,SockJS/Meteor会回退到XHR,但不幸的是,这会引起所涉及的应用程序中的一些错误。因此,在大多数情况下,我真的需要WebSocket正常工作。
我使用此处提到的补丁修复了我的Apache安装:https://dev59.com/kWYq5IYBdhLWcg3weQgy#16998664。看起来进展顺利,但没有任何改变...
我的Apache代理指令目前如下:
ProxyRequests Off
ProxyPreserveHost On
ModPagespeed Off
<proxy>
Order deny,allow
Allow from all
</proxy>
ProxyPass / http://10.0.2.6:3000/
ProxyPassReverse / http://10.0.2.6:3000/
我甚至知道什么导致了这个问题。Apache代理与头部进行操作。离开我的机器的问题数据包的原始请求头看起来像这样:
GET /sockjs/430/minw4r_o/websocket HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: myKey
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
User-Agent: My Agent
当数据包从Apache代理程序转发时,情况如下:
GET /sockjs/430/minw4r_o/websocket HTTP/1.1
Host: example.com
Origin: http://example.com
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: myKey
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
User-Agent: My Agent
X-Forwarded-For: 24.xxx.xxx.xxx
X-Forwarded-Host: example.com
X-Forwarded-Server: example.com
Connection: Keep-Alive
因此,“升级”被删除,“连接”被改变,因此Websocket握手失败。现在,我可以尝试使用RequestHeader指令将“Upgrade”始终设置为“websocket”。但是这不太对,我猜这会带来其他问题,因此我想知道是否有真正的解决方案?或者这是https://dev59.com/kWYq5IYBdhLWcg3weQgy#16998664补丁应该解决的问题,但我的应用出了问题?
根据我所读的,切换到nginx可能会使这种设置更容易。我会考虑这个建议,但如果可能的话,我想使用apache,因为nginx会使其他事情更加复杂并花费我很多时间。