【问题标题】:Apache redirect rules for back-end server with WebSockets使用 WebSockets 的后端服务器的 Apache 重定向规则
【发布时间】:2012-08-17 09:21:46
【问题描述】:

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

我的情况如下。我有带有 ws4py 模块的 CherryPy 服务器,它设置了 WebSockets。它在 localhost:9000 上运行。我想要一个 apache 前端,它只是将传入的请求重定向到后端服务器(它做的不止这些,但为了简单起见,它应该这样做)。

我的apache规则很简单

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

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

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

有没有办法修复重写规则以允许存在 Upgrade 标头?

【问题讨论】:

  • 您说的是重定向,但您实际上是在代理。由于它是代理的,升级:websocket 被传递意味着 Apache 期望将 websockets 与后端系统通信,它不准备这样做

标签: apache mod-rewrite redirect websocket cherrypy


【解决方案1】:

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

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

【讨论】:

  • apache 2.4 同时能够代理ws请求吗?
猜你喜欢
  • 2015-09-18
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多