我有一个Apache代理for Meteor应用程序,Apache和Meteor都在两个单独的机器上。我需要它,随着Apache必须服务很多真实的网站,由于资源有限,在这台机器上安装Meteor应用程序并不是一个好主意。

然而,如果我尝试通过代理从外部连接,则WebSocket握手使用响应代码400“即可升级到WebSocket”。当我直接从LAN连接到流入机时,一切都正常工作。 当WebSocket失败时,Sockjs / Meteor返回XHR但不幸的是,这在有问题的应用程序中会带来一些错误。所以我真的需要WebSocket在大多数情况下工作。

我用这里提到的补丁修补了我的apache安装: https://stackoverflow.com//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 Handshake失败。现在我可以尝试使用RequestHeader指令将“升级”设置为“WebSocket”。然而,这并不感觉到,我猜它会提出其他问题,所以我想知道是否存在这个问题的真实解决方案?或者是来自

有帮助吗?

解决方案

我们为apache和sockjs应用程序一起使用它。Apache正在自动执行WebSocket Proxy,但您必须将方案重写为WS,否则它将其退回到XHR。但只有连接是WebSocket握手。添加以下内容将解决您的问题:)(注意:将“自身的后端URL”相应更改生成频码码。

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^websocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade [NC]
RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]
.

其他提示

这个答案是基于FATIH的答案。他的解决方案失败了发送除“升级”之外的连接请求标题的浏览器,例如“保持活动,升级”。对Firefox 42对我来说是这种情况。

要解决Firefox的问题,还要更改Apache RewriteCond,如下所示:

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]
.

^升级$ 变为升级$

我想把它作为法律答案的评论,但我缺乏必要的声誉。

在阅读几个答案后,发布在流星论坛上,这里有很多试验是整个Enchilada,为我工作。其他答案有点不完整,或者至少对我不起作用。

我不得不做:

sudo a2enmod proxy_wstunnel 
.

还必须添加一个proxypass和proxypassreverse并更改^升级$才能从另一个升级$升级$。

<VirtualHost *:80>
    ServerName  some-domain.com

    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
    RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]

    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/

</VirtualHost>
.

然后重新启动apache。

我在控制台上检查,现在没有错误,没有xhr请求。所以我假设它正常工作

我希望我能够向您提供与Apache指令的直接回复,但是由于您提到了nginx并且事实是,很难配置,我想重视实际使用nginx但是屏蔽你的所有复杂性。

https://github.com/phusion/乘客/维基/闪鸿 - 乘客:-Meteor-tutorial 浏览设置的步骤闪存乘客有或没有nginx(内部使用nginx)对于多实例生产流程部署,可以扩展到使用服务器中的所有内核。

它和:

$ cd meteor-app-directory
$ mkdir public tmp
$ passenger start
.

fatih-arslan 的答案与 derwiwie 的修正案曾像魅力一样工作。 我必须使用的一件事是将 wss 而不是 ws ,因为我的服务仅在https中工作。

RewriteEngine on  
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]  
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]  
RewriteRule .* wss://localhost:3000%{REQUEST_URI} [P]
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top