Apache proxyPassReverse 和 Websockets

Posted

技术标签:

【中文标题】Apache proxyPassReverse 和 Websockets【英文标题】:Apache proxyPassReverse and Websockets 【发布时间】:2013-01-05 08:42:15 【问题描述】:

我一直在从事一个使用 websockets 的 Perl Mojolicious 项目。我想在运行 apache 的共享服务器上启动它,并使用 proxyPass 和 proxyPassReverse 使我的 Mojolicious 代码与 Hypnotoad 一起运行的 url 更漂亮。

我的设置如下。

阿帕奇网址:

mydomain.com

Hypnotoad 网址:

mydomain.com:8080

通过以下 apache 条目,我可以将 Hypnotoad 服务器反向代理到

project.mydomain.com

apache.conf 条目

<VirtualHost *:80>
  ServerName project.mydomain.com
  DocumentRoot /var/www/project
  <Directory /var/www/project/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
  </Directory>
  ProxyRequests Off
  ProxyPreserveHost On
  ProxyPass / http://mydomain.com:8080/ keepalive=On
  ProxyPassReverse / http://mydomain.com:8080/
  RequestHeader set X-Forwarded-HTTPS "0"
</VirtualHost>

但是,当我使用时,我的 websocket 请求会出现 404 错误:

ws://project.mydomain.com/get-data

当我使用时出现 302 错误:

ws://mydomain.com:8080/get-data

我想这不是问题,因为 websocket 没有检查身份验证,但他们使用 Mojolicious 路由来检查您是否可以通过 websocket 发布。

据我所知,Apache 不支持反向代理 websocket。在 apache/httpd conf 文件中。

有没有人找到一个使用 Apache 的可用解决方案,该解决方案对于生产环境来说是稳定的?

【问题讨论】:

【参考方案1】:

Apache httpd 2.4.6 包括代理 websocket 请求。

【讨论】:

这将更适合评论而不是答案。一旦您have enough reputation,请考虑将其移至对该问题的评论。 @SameerSingh 我认为这正是补丁提交者对问题的答案。【参考方案2】:

这可能是您正在寻找的。看一看:https://npmjs.org/package/npr

【讨论】:

【参考方案3】:

3 月 a patch was committed to the Apache trunk 由 Jim Jagielski 编写,它允许正确代理 websockets。该补丁添加了一个名为 proxy_wstunnel 的新子模块 allows mod_proxy to work with the "ws" and "wss" protocols。

该模块尚未出现在任何官方 Apache 版本中(截至 2013 年 6 月 8 日),因此您需要自己编译它。 Voyageur's blog 描述了 Apache 2.2 的过程,但 Apache 2.4 应该更容易

【讨论】:

以上是关于Apache proxyPassReverse 和 Websockets的主要内容,如果未能解决你的问题,请参考以下文章

Apache 和 Tomcat:ProxyPass 和 ProxyPassReverse

用 PHP 模拟 Apache 的 ProxyPassReverse

使用PHP模仿Apache的ProxyPassReverse

Apache代理502

Apache配置转发

如果我使用 mod rewrite,是不是需要使用 ProxyPassReverse?