关于mod rewrite:具有WebSockets的后端服务器的Apache重定向规则

Apache redirect rules for back-end server with WebSockets

我正在尝试弄清楚如何为实现websocket(通过ws4py模块完成)的后端CherryPy服务器正确设置apache重定向规则。问题是,如果您使用重写引擎或proxypass,它将剥离重定向请求中的Upgrade标头,因此CherryPy服务器对此抱怨,并在握手步骤中失败。

我遇到的情况如下。我有带有ws4py模块的CherryPy服务器,用于安装WebSockets。它在localhost:9000上运行。我想拥有一个Apache前端,它仅将传入的请求重定向到后端服务器(它不仅可以执行此操作,但是为了简单起见,它应该执行该操作)。

我的apache规则很简单

1
RewriteRule ^(/websocket(/.*)?)$ http://some_host:9000$1 [P,L]

因此,对于以/ websocket开头的所有请求,它将它们重定向到在端口9000上运行的后端服务器。P标志代表Proxy,L停止重写过程(请参阅http://borkweb.com/story/apache-重写备忘单)

如果客户端使用HTTP标头Upgrade:websocket发送请求,则apache引擎(重写模块)会将其剥离,从而导致WebSocket握手失败。

是否有任何方法可以修复重写规则以允许存在Upgrade标头?


不幸的是,Apache还没有反向代理WebSocket连接的能力(绝对应该!)。但是,有一种解决方案允许使用Apache处理Web请求,并通过其他方式处理WebSocket连接。此解决方案涉及将HAProxy用作apache和WebSocket服务器的前端。

这里有几个相关的链接可以帮助您入门:

  • http://lheurt.blogspot.com/2011/12/reverse-proxy-nodejs-websockets-with.html
  • HAProxy WebSocket断开连接